Печатать n строк перед match1 И строк после match1 до match2

Решение Bash для обновленного запроса:

echo "$b"
#Output
Text1 somethingAA1111111something,elseAA2222222fooblahAA3333333^blahblahAA4444444 text1
Text2 somethingAA1111111something,elseAA7777777fooblahAA5454545^blah text2
Text3 somethingAA1111111something,elseAA2222222foo text3

while IFS=" " read -r f1 f2 f3;do 
  g=($(grep -Po 'AA[0-9]{7}' <<<"$f2"));
  out=$(printf '%s,%s,%s\n' "$f1" "${g[*]}" "$f3");
  echo "$out" |sed 's/,/\x00/g; s/ /,/g; s/\x00/ /g';
done <<<"$b"
#Output
Text1 AA1111111,AA2222222,AA3333333,AA4444444 text1
Text2 AA1111111,AA7777777,AA5454545 text2
Text3 AA1111111,AA2222222 text3
1
11.01.2017, 13:33
3 ответа

Сгруппируйте команды таким образом, чтобы они использовали один и тот же ввод, поэтому, когда grep завершает работу sed берет на себя:

{ grep -B2 -m1 match1; sed '/match2/q'; } < infile
1
27.01.2020, 23:46

sed - это редактор потока. поэтому, если вы хотите напечатать предыдущие строки, которые уже пропали, вам нужно сохранить их в буфере для дальнейшего использования. поэтому я сначала сохраняю две строки в буфере 1 {N; N} и поддерживаю их с помощью команд N; D

sed -rn '1{:X N;N}; 
/match1[^\n]*$/{:Y N; /match2[^\n]*$/{p;n;bX}; bY};
N;D' infile
​​
0
27.01.2020, 23:46

Попробуйте передать вывод команды grep команде sed ? Например,

grep <options> file | sed <options>
0
27.01.2020, 23:46

Теги

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