SED: Сопоставление двух шаблонов на одной линии

Привет, я хочу удалить строку с помощью sed, если она соответствует 2 регулярным выражениям в одной строке. Например, строка начинается с /* и заканчивается */ (комментарий). Следующий скрипт сделает большую часть этого. sed -e '/^/*/ d' -e '/*/$/ d' имя файла Этот сценарий удалит все строки, начинающиеся с * и заканчивающиеся на */. Я хочу, чтобы он удалял строку, только если она соответствует обоим критериям, а не одному.


person Brian Knott    schedule 30.04.2010    source источник


Ответы (3)


Пытаться

sed '/^\/\*.*\*\/$/ d' filename

Ключевым моментом здесь является то, что вы можете как бы объединить два шаблона регулярных выражений в один, просто соединив их с помощью .*, что соответствует «любому количеству любых символов». Конечно, это обеспечивает порядок между ними. Первый шаблон ^\/\* должен появиться перед вторым \*\/$, чтобы этот конкретный шаблон совпадал.

Кроме того, поскольку * имеет особое значение в регулярном выражении, обязательно избегайте своих звездочек, так же как вы должны избегать косых черт.

person echo    schedule 30.04.2010

Для вашей конкретной проблемы вы можете сделать что-то в соответствии с рекомендациями @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.

person Dale Hagglund    schedule 30.04.2010

это также удаляет многострочные комментарии

eg

# cat file
blah blah /* comment */
words1
words2
/* multiline
   comments
/*
end

$ awk -vRS='*/'  '{ gsub(/\/\*.*/,""); }1' file
blah blah

words1
words2

вы можете добавить еще один фильтр к sed 's|\/\/.*||', чтобы также отфильтровать // комментарии

person ghostdog74    schedule 30.04.2010