SED Bash Переменная для удаления строки в файле

Но как мне узнать, какие команды предоставляет определенный пакет?

В Linux нет ничего похожего на "команды". Если вас интересует, какие файлы предоставляет пакет, есть rpm:

rpm -ql package_name

А исполняемые файлы, они же "команды", обычно находятся по пути /usr/bin/.

0
01.12.2018, 23:07
2 ответа

ИМХО редактирование файла, который вы читаете, чревато опасностью. Позвольте мне предложить другое решение:

  • прочитать список ввода(urls.lst)построчно
  • wgetURL
  • в случае успеха добавьте URL во второй файл(received.lst)

Если процесс прерван и вы хотите перезапустить его со списком URL-адресов, которых у вас еще нет, вы можете получить этот список с помощью:

diff --new-line-format="" --unchanged-line-format=""  urls.lst received.lst
0
28.01.2020, 02:23

Вы выбрали неправильную процедуру.

Предположим, что значение aначинается с1:a=1

Когда сценарий считывает filenameв строке done<"$filename", считывается содержимое файла (, как оно есть на тот момент времени ). Затем вы изменяете тот же файл в -поместите удалив одну строку (давайте предположим первую ), тогда следующее чтение возьмет вторую исходную строку (теперь первую в файле ), но удалит индекс строки 2 (, который теперь является третьим )в настоящем деле. Так далее и тому подобное.

Чтобы посмотреть, что произойдет, запустите этот скрипт:

#!/usr/bin/bash
a=1
filename=infile
seq 5 >"$filename"

while read -r line; do
    echo "Read line $line for index $a"
    echo "Will remove line $(sed "${a}!d" "$filename")"
    sed -ie "${a}d" "$filename"
    echo;echo next
    let a+=1
done < "$filename"

Вот так:

$./script
Read line 1 for index 1
Will remove line 1

next
Read line 2 for index 2
Will remove line 3

next
Read line 3 for index 3
Will remove line 5

next
Read line 4 for index 4
Will remove line 

next
Read line 5 for index 5
Will remove line 

next

Как видите, строки 1,3,5 удалены.

Чтобы сделать это правильно :либо

  • начать с конца
  • сохранить индекс в дополнительном файле
  • или повторно -запустить процесс только для первой строки файла, пока файл не станет пустым.

Реализация третьего варианта с помощью уже известных вам инструментов:

#!/usr/bin/bash

filename=infile
seq 5 >"$filename"

while [[ -s "$filename" ]]; do
    name=$(head -n1 "$filename")
    echo wget "$name"
    sed -i '1d' "$filename"
done
3
28.01.2020, 02:23

Теги

Похожие вопросы