У меня есть HTML-файл. Я хочу удалить все строки, которые не начинаются с <tr>
.
Я старался:
cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'
но он удалил все строки.
text-processing
sed
Майкл Даррант
источник
источник
grep
.s/^[^tr]...
соответствует строкам, начинающимся с любого символа, кромеt
илиr
. Квадратные скобки - это диапазон символов в регулярном выражении.Ответы:
Попробуйте это с помощью GNU sed:
или
источник
!d
особенно полезной, потому что она позволяет вам написать другую команду sed в выражении, тогда какp
единственная печатает совпадение, но следующая команда имеет ввод без изменений.Часть между ними
/
является регулярным выражением. Командаd
удаляет совпадающие строки.Обновление: ой, извините, я видел, что вы сказали НЕ. Так
Где
!
сводит на нет смысл матча.источник
Если это должно быть
sed
:-i
редактирует файл на месте,-n
предотвращаетsed
печать всех строк, регулярное выражение означает совпадение со всей строкой, с которой start (^
),<tr>
и эти строки будут напечатаны (p
).С
grep
:С
-E
grep интерпретирует расширенные регулярные выражения.С
awk
:Или чисто
bash
:Это
[[
внутреннее условное выражение bashs. Мы сравниваем$l
с регулярным выражением и, если оно успешно (&&
), мы печатаем строку сecho
.источник
"$l"
. И вы помещаете его в качестве первого аргумента вecho
командной строке, поэтому у вас возникнет проблема, если он начинается с-option
. (Используйтеprintf '%s\n' "$l"). Also, shell
read`, чтобы читать по одному за раз, поэтому это очень медленно. Обработка текстовых файлов в чистом bash обычно не является хорошим выбором, если вы не знаете, что ваш файл очень маленький.Самый простой и простой ответ будет:
Это распечатает файл только с теми строками, которые начинаются с, что может быть хорошо, если вы не хотите изменять файл напрямую (например, с помощью sed).
Затем, если вам нравится то, что вы видите в выводе, вы можете просто распечатать в файл с
> file
В этом случае вы экономите время на резервное копирование файла, прежде чем пытаться выполнить некоторые команды.
источник