Команда 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