Стирание 2-строчного шаблона с помощью sed/grep/whatever

Похоже, что ksh делает что-то другое с арифметическим расширением; чтобы обойти это, я бы явно использовал арифметическую подстановку, которая ведет себя должным образом как в AIX 6, так и в AIX 7:

...
if [[ ( $((f_count * sleep_interval % alarm_interval)) -eq 0 ) && $f_count -gt 0 ]] 
...
2
12.09.2016, 14:02
2 ответа

sed

Это должно приближаться к тому, что вам нужно:

<cvslog sed -n '/Working file/ { N; /\n=\+$/b; :a; N; /\n=\+$/!ba; p; }'

Вывод:

Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================

Пояснение

Вот то же самое sed сценарий с комментариями:

/Working file/ {
  N                 # append next line to pattern space
  /\n=\+$/b         # is it a file separator -> next file
  :a
  N                 # append next line to pattern space
  /\n=\+$/!ba       # isn't it a file separator -> read next line
  p                 # otherwise print accumulated text
}

awk

Если вы укажете awk использовать строку разделителя файлов в качестве разделителя записей ( RS ), это станет довольно простым для определения разумных критериев выбора:

<cvslog awk 'NF>2' RS='\n=+\n' FS='\n' ORS='\n\n'

Вывод:

Working file: modifiedfile1.h  
----------------------------------
revision 1.3
Fixed some bug

Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature

bash и coreutils

Просто для удовольствия:

csplit cvslog '/=\{16\}/1' '{*}'
wc -l xx* | 
head -n-1 | 
while read n f; do 
  if (( n > 2 )); then 
    cat $f
  fi
done

Вывод:

Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
3
27.01.2020, 21:59
sed '/Working file:/ N ; s/\n/PLACEHOLDER/' changelog.txt |
grep -v 'PLACEHOLDER===' |
sed 's/PLACEHOLDER/\n/ 

действительно может быть сокращен до:

$ sed '/Working file:/{N;/===/d}' changelog.txt 
Working file: modifiedfile1.h
----------------------------------
revision 1.3
Fixed some bug
================
Working file: modifiedfile2.h
----------------------------------
revision 1.1
Added some feature
================
Working file: unmodifiedfile3.h


  • Чтобы удалить все строки, содержащие Рабочий файл: и следующую строку, если она содержит === , а также последнюю строку, если она содержит Рабочий файл:

Спасибо @ ilkkachu за предложение. Если шаблон необходимо сопоставить в начале строки, используйте ^ Рабочий файл:

$ cat ip.txt 
Working file: 123
================
Working file: f1
----------------------------------
revision 1.3
Fixed some bug
================
Working file: abc
================
Working file: file
----------------------------------
revision 1.1
Added some feature
================
Working file: xyz

$ sed '/Working file:/{N;/===/d}' ip.txt | sed '${/Working file:/d}' 
Working file: f1
----------------------------------
revision 1.3
Fixed some bug
================
Working file: file
----------------------------------
revision 1.1
Added some feature
================
1
27.01.2020, 21:59

Теги

Похожие вопросы