Правильно ли я интерпретирую `sed -i.bak '/ ^ x / d'« $ SOME_FILE »`?

sed принимает данные со стандартного ввода, а не из командной строки, поэтому ваш сценарий не будет работать ни теоретически, ни практически. sed -i 1,10d $ dr не делает то, что вы думаете ... sed будет рассматривать значение «$ dr» как список имен файлов для обработки.

Попробуйте echo "$ dr" | sed -e '1,10d' или sed -e '1,10d' <<< "$ dr" .

Кстати, вы должны использовать здесь двойные кавычки вокруг "$ dr" , иначе sed не получит несколько строк ввода, разделенных \ n , он получит только одну строку ввода.

Или еще лучше, чтобы получить только записи NS, замените все свои команды sed одной этой командой:

tr=$(echo "$dr" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')

В качестве альтернативы удалите все промежуточные шаги и просто запустите следующее:

tr=$(dig ns "$d" | sed -n -e '/IN[[:space:]]\+NS[[:space:]]/p')

Или вы можете получить только имена хостов серверов имен с помощью:

tr=$(dig ns "$d" | awk '/IN[[:space:]]+NS[[:space:]]/ {print $5}')

Кстати, вывод host -t ns domain.example.com может быть легче проанализировать, чем вывод dig .

4
06.05.2016, 18:03
2 ответа

Да, вы правильно поняли. Исходя из вашего формата, я предполагаю, что вы используете GNU sed (в других реализациях может потребоваться пробел между -i и .bak , а некоторые могут не поддерживать -i вообще). Его -i работает следующим образом (из info sed ):

-i[SUFFIX]
--in-place[=SUFFIX]
     This option specifies that files are to be edited in-place.  GNU
     `sed' does this by creating a temporary file and sending output to
     this file rather than to the standard output.(1).

 This option implies `-s'.

 When the end of the file is reached, the temporary file is renamed
 to the output file's original name.  The extension, if supplied,
 is used to modify the name of the old file before renaming the
 temporary file, thereby making a backup copy(2)).

 This rule is followed: if the extension doesn't contain a `*',
 then it is appended to the end of the current filename as a
 suffix; if the extension does contain one or more `*' characters,
 then _each_ asterisk is replaced with the current filename.  This
 allows you to add a prefix to the backup file, instead of (or in
 addition to) a suffix, or even to place backup copies of the
 original files into another directory (provided the directory
 already exists).

 If no extension is supplied, the original file is overwritten
 without making a backup.

Команда d удаляет любую строку, в которой предыдущее выражение было успешным. Строго говоря , он удаляет «пространство шаблонов», но в простых сценариях sed это строка.

10
27.01.2020, 20:57

'/ ^ x / d' Фактическое пространство здесь не требуется. Лучше было бы '/ ^ x \ s \ d' , которое представляет начало строки, начиная с x , затем пробела, а затем цифры.

-2
27.01.2020, 20:57

Теги

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