Удаление нескольких строчных шаблонов не работает, когда шаблоны хранятся в файле - PullRequest
2 голосов
/ 17 марта 2012

Я задал вопрос о поиске нескольких строк, ответы на которые я нашел здесь: Поиск нескольких строк, включая пустую, в сценарии оболочки

Однако, если я храню несколько такихКоманда в файле и выполнить их, затем первый поиск проходит нормально, однако при поиске последующих шаблонов я получаю пустой вывод из sed.

То есть, если я храню,

sed -n '1h; 1!H; ${ g; s/<Pattern1>\n<pattern2> //g p }' file-name
sed -n '1h; 1!H; ${ g; s/<Pattern3>\n<pattern4> //g p }' file-name

в файле и затем выполнить каждую строку в этом файле с помощью ключевого слова eval, затем первый sed заменяет первые многострочные шаблоны, т.е. pattern1, затем pattern2, однако возвращает пустое значениевывод, даже если файл содержит эти шаблоны.Есть какие-нибудь подсказки?

1 Ответ

1 голос
/ 19 марта 2012

Мне неясно, что вы хотите сделать, но я предполагаю, что вы хотите удалить пару строк, если первая строка соответствует Pattern1, а вторая соответствует Pattern2 или если первая строка соответствует Pattern3 и второй матч Pattern4. Если это так, у вас должно работать следующее:

#!/bin/sh

cat <<\EOF |
Mary

John
Doe
Simon
Henry
EOF
sed -n -e 'H; ${ g
  # append a newline to correctly match at the end of the file
  s/$/\n/
  # delete instances of John\nDoe
  s/\nJohn\nDoe\n/\n/g
  # delete instances of Mary\n<blank>
  s/\nMary\n\n/\n/g
  # remove the newlines added at the beginning and end
  s/\n\(.*\)\n/\1/
  # print the result
  p
}'
# output:
# Simon
# Henry

Приведенный выше скрипт sed использует H вместо 1h; 1!H для получения новой строки в начале шаблона. Это также добавляет новую строку в конце. Это позволяет искать \nPattern1\nPattern2\n вместо Pattern1\nPattern2. Это предотвращает плохие совпадения: поиск «Anne Doe» не должен найти «MaryAnne Doe», а поиск «John Clark» не должен искать «John Clarkson».

...