Как добавить # перед любой строкой, содержащей соответствующий шаблон в BASH?

Мне нужно добавить # перед любой строкой, содержащей шаблон "000", например, рассмотреть этот пример файла:

This is a 000 line.
This is 000 yet ano000ther line.
This is still yet another line.

Если я запустил команду, она должна добавить # в начало любых файлов, где было найдено "000". Результатом будет следующее:

#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line.

Лучшее, что я могу сделать, это цикл while, который выглядит слишком сложным:

while read -r line
do
    if [[ $line == *000* ]]
    then
          echo "#"$line >> output.txt
    else
          echo $line >> output.txt
    fi
done < file.txt

Как добавить # в начало любой строки, где найден шаблон?

Ответ 1

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

sed 's/.*000/#&/' file

Ответ 2

Следующая команда sed будет работать для вас, которая не требует каких-либо групп захвата:

sed /000/s/^/#/

Пояснение:

  • /000/ соответствует строке с 000
  • s выполнить подстановку в строках, сопоставленных выше
  • Подстановка будет вставлять символ фунта (#) в начале строки (^)

Ответ 3

или используйте ed:

echo -e "g/000/ s/^/#/\nw\nq" | ed -s FILENAME

или открыть файл в ed:

ed FILENAME

и напишите эту команду

g/000/ s/^/#/
w
q

Ответ 4

Попробуйте эту команду GNU sed,

$ sed -r '/000/ s/^(.*)$/#\1/g' file
#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line.

Объяснение:

  • /000/ замена sed работает только на строке, которая соответствует 000. Когда он найдет соответствующую строку, он добавит символ #.

И через awk,

$ awk '/000/{gsub (/^/,"#")}1' file
#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line
  • Функция
  • gsub используется для добавления # infront строк, содержащих 000.