Привет, я хочу удалить строку с помощью sed, если она соответствует 2 регулярным выражениям в одной строке. Например, строка начинается с /* и заканчивается */ (комментарий). Следующий скрипт сделает большую часть этого. sed -e '/^/*/ d' -e '/*/$/ d' имя файла Этот сценарий удалит все строки, начинающиеся с * и заканчивающиеся на */. Я хочу, чтобы он удалял строку, только если она соответствует обоим критериям, а не одному.
SED: Сопоставление двух шаблонов на одной линии
Ответы (3)
Пытаться
sed '/^\/\*.*\*\/$/ d' filename
Ключевым моментом здесь является то, что вы можете как бы объединить два шаблона регулярных выражений в один, просто соединив их с помощью .*
, что соответствует «любому количеству любых символов». Конечно, это обеспечивает порядок между ними. Первый шаблон ^\/\*
должен появиться перед вторым \*\/$
, чтобы этот конкретный шаблон совпадал.
Кроме того, поскольку *
имеет особое значение в регулярном выражении, обязательно избегайте своих звездочек, так же как вы должны избегать косых черт.
Для вашей конкретной проблемы вы можете сделать что-то в соответствии с рекомендациями @echo. Однако, если вам нужно более общее решение, например, такое, в котором совпадения регулярного выражения не привязаны ни к одному концу строки, ни к другому, или могут быть в любом порядке в строке, или могут даже перекрываться, вы будете что-то вроде следующего сценария sed:
/regexp1/! b notboth
/regexp2/! b notboth
:both
# sed commands if both patterns match
n
:notboth
# sed commands if at least one pattern doesn't match
n
Это использует возможности ветвления sed. Команда b
переходит к именованной метке, если совпадение с шаблоном успешно, а конечный !
в шаблоне инвертирует смысл совпадения. так, примерно,
Поместите это в файл, скажем, foo.sed
, и запустите его как sed -f foo.sed
.
это также удаляет многострочные комментарии
eg
# cat file
blah blah /* comment */
words1
words2
/* multiline
comments
/*
end
$ awk -vRS='*/' '{ gsub(/\/\*.*/,""); }1' file
blah blah
words1
words2
вы можете добавить еще один фильтр к sed 's|\/\/.*||'
, чтобы также отфильтровать //
комментарии