САС: Соответствие на 2 образцах на одной линии - PullRequest
2 голосов
/ 30 апреля 2010

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

Ответы [ 3 ]

2 голосов
/ 30 апреля 2010

Попробуйте

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

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

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

0 голосов
/ 30 апреля 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.

0 голосов
/ 30 апреля 2010

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

например

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

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

words1
words2

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...