Это удалит #
из начала строки 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/^/#/
Если мы дойдем до этой команды, это означает, что подстановка не удалась (то есть строка не была закомментирована), поэтому мы вставляем #
.