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

Мне нужна команда / скрипт, чтобы получить конфликты слияния CVS. По сути, мне нужна команда SED или AWK для печати только строк, которые находятся между двумя заданными шаблонами

Пример:

Pattern1="RCS file:"
Pattern2="conflicts during merge"

Когда я пробую простую команду SED, такую ​​как:

sed -n '/RCS file:/,/conflicts during merge /p' INPUT.txt

Я не получаю ожидаемый результат. Я хочу захватить детали только для "filename2 и filename3" (которые имели конфликты во время слияния).

Может кто-нибудь, пожалуйста, помогите?

INPUT.txt

RCS file: /hello/filename1
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename1

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename4
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename4

(Expected) OUTPUT.txt

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge

RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge

4 ответа

Ваш sed Команда начинает выводить всякий раз, когда видит "файл RCS", и останавливается, когда видит маркер "конфликтов". Так что это в значительной степени выводит все. С помощью sed можно делать то, что вы хотите, но это сложно. Awk намного проще:

awk -v RS= '/conflicts/ {print $0}' INPUT.txt 

Используйте понятие записей awk с пустой строкой, разделяющей их, и, по сути, grep каждой записи. Таким образом, это не печатает строки между двумя шаблонами, а печатает каждый блок строк, который соответствует определенному шаблону.

Ну вот:

sed -n '/RCS file:/ !{H;d}; /RCS file:/ {x; /conflict/p}; $ {x; /conflict/p}' input.txt

Для каждой строки, которая не соответствует 'RCS-файлу:' - добавьте ее для хранения пробела. Если он совпадает со строкой (или является концом файла) - поменяйте местами пространство паттерна с пробелом и проверьте, соответствует ли оно "conflit". Распечатайте, если это так.

Может быть проще, если мы используем ветвление.

Как это:

sed -n '$ba; /RCS file:/ba; H; d; :a; x; /conflict/p' input.txt

Здесь у вас есть подсказка:

awk '{if ($1=="HO") i=1}; {if ($1=="JOU") i=0}; i{print}' file

Пример:

$ cat file
HI
HO
JE
JOU
LA

Так,

Pattern1="HO"
Pattern2="JOU"
awk -v p1=${Pattern1} -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file
HO
JE

Исходя из вашего случая,

Pattern1="RCS file:"
Pattern2="conflicts during merge"

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1==p1) i=1}; {if ($1==p2) i=0}; i{print}' file

редактировать

Если вы хотите найти строку, содержащую этот текст, вы можете сделать это следующим образом:

Pattern1="RCS file:"
Pattern2="conflicts during merge"

$ awk -v p1=$(Pattern1) -v p2=${Pattern2} '{if ($1 ~ p1) i=1}; {if ($1 ~ p2) i=0}; i{print}' file

Братан,

используйте egrep..... это просто, не нужно беспокоиться о SED и AWK. Это фиксированный шаблон линий, которые вы хотите здесь....

 egrep +B4 conflict INPUT.txt   

здесь опция B печатает 4 строки перед совпадением вместе со строкой, которая соответствует шаблону (я использую GNU egrep)

выход egrep:

RCS file: /hello/filename2
retrieving revision 1.4.2.1.18.2.2.1
retrieving revision 1.4.2.1.18.2.2.1.4.2
Merging differences between 1.4.2.1.18.2.2.1 and 1.4.2.1.18.2.2.1.4.2 into filename2
rcsmerge: warning: conflicts during merge
--
RCS file: /hello/filename3
retrieving revision 1.6.18.1.2.1.2.1
retrieving revision 1.6.18.1.2.1.2.1.4.3
Merging differences between 1.6.18.1.2.1.2.1 and 1.6.18.1.2.1.2.1.4.3 into filename3
rcsmerge: warning: conflicts during merge
Другие вопросы по тегам