как удалить строки комментариев (как # bal bla) и пустые строки (строки без charecters) из файла с помощью одной команды sed?
спасибо Lidia
как удалить строки комментариев (как # bal bla) и пустые строки (строки без charecters) из файла с помощью одной команды sed?
спасибо Lidia
Если вы беспокоитесь о запуске двух процессов sed
в конвейере, а не в одном, вам, вероятно, не должно быть, это не так неэффективно.
Однако, если вам нужен один процесс, вы можете использовать несколько аргументов -e
, например:
sed -e 's/#.*$//' -e '/^$/d' inputFile
В ответ на ваш комментарий о том, почему вам нужен один процесс, вы хотите использовать sed -i
для редактирования на месте, вы все равно можете сделать это в соответствии со следующей стенограммой:
pax> echo 'Line # with a comment' >qq
pax> echo >>qq
pax> echo '# Line with only a comment' >>qq
pax> cat qq
Line # with a comment
# Line with only a comment
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq
pax> cat qq
Line
pax> _
Обратите внимание, как файл изменяется на месте даже с двумя параметрами -e
. Вы можете видеть, что обе команды выполняются в каждой строке. Сначала строка с комментарием удаляется, а все удаляется, поскольку она пуста.
Кроме того, также удаляется исходная пустая строка.
@paxdiablo имеет хороший ответ, но его можно улучшить.
(1) Предложение '/^$/d'
соответствует только 100% пустым строкам.
Если вы хотите также сопоставить строки, которые являются полностью пустыми (пробелы, табы и т.д.), используйте это вместо:
'/^\s*$/d'
(2) Предложение 's/#.*$//'
соответствует только строкам, начинающимся с символа #
в столбце 0.
Если вы хотите также сопоставлять строки, у которых есть только пробелы перед первым #
, используйте это вместо:
'/\s*#.*$/d'
Вышеуказанные критерии могут быть не универсальными (например, в блоке HEREDOC или в многострочной строке Python различные подходы могут быть значительными), но во многих случаях обычное определение "пустых" строк включает в себя только пробелы, и "комментарии" включают пробелы-then- #
.
(3) И, наконец, по OSX, по крайней мере, решение @paxdiablo, в котором первое предложение превращает строки комментариев в пустые строки, а вторая строка пустых строк (включая исходные комментарии) не работает. Кажется более переносимым, чтобы обе статьи /d
удаляли действия, как я сделал.
Пересмотренная команда, включающая следующее:
sed -e '/\s*#.*$/d' -e '/^\s*$/d' inputFile
Альтернативный вариант, используя grep:
cat file.txt | grep -Ev '(#.*$)|(^$)'
вы можете использовать awk
awk 'NF{gsub(/^[ \t]*#/,"");print}' file
В (одном из) моих linux-боксов sed понимает расширенные регулярные выражения с параметром -r, поэтому:
sed -r '/(^\s * #) | (^\s * $)/d' squid.conf.installed
очень полезно для отображения всех непустых строк без комментариев. Регулярное выражение соответствует началу строки, за которой следуют ноль или больше пробелов или вкладок, за которыми следует либо хэш, либо конец строки, и удаляет соответствующие строки из ввода.
Первый пример (paxdiablo) очень хорош, за исключением файла без изменений, просто выводит результат. Если вы хотите изменить его в строке:
sudo sed -i 's/#.*$//;/^$/d' inputFile