Давайте предположим, что вы хотите заменить строку 4 с текстом «другом». Вы можете использовать AWK следующим образом:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
AWK считает ввод «записями» разделен на «поля». По умолчанию одна строка - одна запись. NR
- количество записей. $0
представляет текущую полную запись (в то время как $1
- это первое поле из записи и т. Д., По умолчанию поля - это слова из строки).
Итак, если номер текущей строки равен 4, напечатайте строку «different», но в противном случае распечатайте строку без изменений.
В AWK программный код, заключенный в { }
, запускается один раз на каждой входной записи.
Вы должны процитировать программу AWK в одиночных кавычках, чтобы оболочка не пыталась интерпретировать такие вещи, как $0
.
EDIT: короче и изящнее программы AWK из @chepner в комментариях ниже:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Только для записи (т.е. линии) под номером 4, заменить всю запись со строкой «другом». Затем для каждой входной записи распечатайте запись.
Очевидно, что мои навыки AWK ржавы! Благодарю вас, @chepner.
EDIT: увидеть также еще более короткую версию из @Dennis Уильямсон:
awk 'NR==4 {$0="different"} 1' input_file.txt
Как это работает, объясняется в комментариях: чем 1
всегда оценивает верно, так что связанный блок кода всегда работает. Но не существует связанного блока кода, что означает, что AWK выполняет свое действие по умолчанию только для печати всей строки. AWK спроектирован таким образом, чтобы такие кросс-программы были такими.
Есть ли способ, чтобы сделать СЭД изменить файл в вопросе вместо сброса на экран? – user788171
Теперь я попал в sed: незаконный вариант - я есть исправление для этого? – user788171
sudo port install sed? ты на маке? если это так, просто используйте версию * nix –