Удалить все строки, начинающиеся С# из файла

Все строки с комментариями в файле начинаются с #. Как удалить все строки (и только те строки), которые начинаются с #? Другие строки, содержащие #, но не в начале строки, следует игнорировать.

Ответ 1

Это можно сделать с помощью sed one-liner:

sed '/^#/ d'

Это говорит: "Найдите все строки, начинающиеся С#, и удалите их, оставив все остальное".

Ответ 2

Я немного удивлен, что никто не предложил наиболее очевидное решение:

grep -v '^#' filename

Это решает проблему, как указано.

Но обратите внимание, что общее соглашение предназначено для всего: от # до конца строки, которое должно рассматриваться как комментарий:

sed 's/#.*$//' filename

хотя это относится, например, к символу # в строковом литерале как начало комментария (которое может быть или не быть релевантным для вашего случая) (и оно оставляет пустые строки).

Строка, начинающаяся с произвольного пробела, за которым следует #, также может рассматриваться как комментарий:

grep -v '^ *#' filename

если пробелы - это пробелы или

grep -v '^[  ]#' filename

где два пространства на самом деле представляют собой пробел, за которым следует буквальный символ табуляции (введите "вкладка управления-v" ).

Для всех этих команд опустите аргумент filename для чтения со стандартного ввода (например, как часть канала).

Ответ 3

Противоположность решению Раймонда:

sed -n '/^#/!p'

"ничего не печатают, кроме строк, которые НЕ начинаются С#"

Ответ 4

Вы можете использовать следующее для решения awk -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile

Ответ 5

Вы можете напрямую редактировать свой файл с помощью

sed -i '/^#/ d'

Если вы также хотите удалить строки комментариев, начинающиеся с пробелов, используйте

sed -i '/^\s*#/ d'

Обычно вы хотите сохранить первую строку вашего скрипта, если это sha-bang, поэтому sed не следует удалять строки, начинающиеся с #!. также следует удалить строки, которые содержат только хэш, но не содержат текста. собрать все вместе:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

Чтобы соответствовать всем вариантам sed, необходимо добавить расширение для резервной копии в опцию -i:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

Ответ 6

Этот ответ основывается на более раннем ответе Keith.

egrep -v "^[[:blank:]]*#" следует отфильтровать строки комментариев.

egrep -v "^[[:blank:]]*(#|$)" должен отфильтровывать как комментарии, так и пустые строки, как это часто бывает полезно.

Информацию о [:blank:] и других классах символов см. в https://en.wikipedia.org/wiki/Regular_expression#Character_classes.

Ответ 7

чтобы удалить символ комментария (#), но сохранить остальную часть строки и сохранить sha-bang:

 awk '{ if( ($0 !~ /^ *#/) || ($0 ~ /^ *#!/) ) print $0 ; else  {gsub(/^ *#/ , "" ); print } } ' teste.sh  nter code here

Ответ 8

Вот он с циклом для всех файлов с некоторым расширением:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done