Как вставить определенный символ в определенную строку файла, используя sed или awk? - PullRequest
2 голосов
/ 27 июня 2019

Я хочу использовать команду для редактирования определенной строки файла вместо использования vi. Это вещь. Если есть #, начинающийся со строки, замените #, чтобы он был раскомментирован. В противном случае добавьте #, чтобы оставить комментарий. Я хотел бы использовать sed или awk. Но это не сработает, как ожидалось.
Это file.

what are you doing now?
what are you gonna do? stab me?
this is interesting.
This is a test.
go big
don't be rude.

Например, я просто хочу добавить # в начале строки 4 This is a test, если она не начинается с #. И если он начинается с #, то удалите #.

Я уже пробовал через sed & gawk (awk)

gawk -i inplace '$1!="#" {print "#",$0;next};{print substr($0,3,length-1)}' file 
sed -i /test/s/^#// file  # make it uncomment

sed -i /test/s/^/#/ file  # make it comment

Я не знаю, как использовать if else, чтобы заставить sed работать. Я мог сделать это только одной командой, а затем использовать другое регулярное выражение, чтобы сделать обратное.
Используя gawk, он работает как основная линия. Но это испортит весь остальной код.

Ответы [ 4 ]

2 голосов
/ 27 июня 2019

Это может сработать для вас (GNU sed):

sed '4{s/^/#/;s/^##//}' file

В строке 4 добавьте # к строке и, если есть 2 #, удалите их.

Можно также написать:

sed '4s/^/#/;4s/^##//' file
2 голосов
/ 27 июня 2019

Это удалит # из начала строки 4 или добавит его, если его там еще не было:

sed -i '4s/^#/\n/; 4s/^[^\n]/#&/; 4s/^\n//' File

Вышеуказанное предполагает GNU sed. Если у вас BSD / MacOS sed, потребуются некоторые незначительные изменения.

Когда sed читает новую строку, мы точно знаем о новой строке, что она не содержит \n. (Если бы это было так, это были бы две строки, а не одна.) Используя эти знания, скрипт работает следующим образом:

  • s/^#/\n/

    Если четвертая строка начинается с #, заменить # на \n. (\n служит уведомлением о том, что строка была закомментирована.)

  • 4s/^[^\n]/#&/

    Если четвертая строка теперь начинается с чего-либо, кроме \n (что означает, что она не была изначально прокомментирована), поставьте # перед.

  • 4s/^\n//

    Если четвертая строка начинается с \n, удалите ее.

Альтернатива: изменение строк, содержащих test

Комментировать / раскомментировать строки, содержащие test:

sed  '/test/{s/^#/\n/; s/^[^\n]/#&/; s/^\n//}' File

Альтернатива: использование awk

Точно такую ​​же логику можно применить с помощью awk. Если мы хотим прокомментировать / раскомментировать строку 4:

awk 'NR==4 {sub(/^#/, "\n"); sub(/^[^\n]/, "#&"); sub(/^\n/, "")} 1' File

Если мы хотим прокомментировать / раскомментировать любую строку, содержащую test:

awk '/test/ {sub(/^#/, "\n"); sub(/^[^\n]/, "#&"); sub(/^\n/, "")} 1' File

Альтернатива: использование sed, но без перевода строки

Комментировать / раскомментировать любую строку, содержащую test:

sed  '/test/{s/^#//; t; s/^/#/; }' File

Как это работает:

  • s/^#//; t

    Если строка начинается с #, удалите ее.

    t сообщает sed, что если замена прошла успешно, остальные команды следует пропустить.

  • s/^/#/

    Если мы дойдем до этой команды, это означает, что подстановка не удалась (то есть строка не была закомментирована), поэтому мы вставляем #.

0 голосов
/ 27 июня 2019
$ awk 'NR==4{$0=(sub(/^#/,"") ? "" : "#") $0} 1' file
what are you doing now?
what are you gonna do? stab me?
this is interesting.
#This is a test.
go big
don't be rude.

$ awk 'NR==4{$0=(sub(/^#/,"") ? "" : "#") $0} 1' file |
  awk 'NR==4{$0=(sub(/^#/,"") ? "" : "#") $0} 1'
what are you doing now?
what are you gonna do? stab me?
this is interesting.
This is a test.
go big
don't be rude.
0 голосов
/ 27 июня 2019

Если вы попали в систему с sed, который не поддерживает редактирование на месте, вы можете вернуться к его дяде ed:

ed -s file 2>/dev/null <<EOF
4 s/^/#/
s/^##//
w
q
EOF

(Стандартная ошибка перенаправленав /dev/null потому что в ed, в отличие от sed, это ошибка, если s ничего не заменяет и, таким образом, знак вопроса выводится со стандартной ошибкой.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...