Решение 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
Сгруппируйте команды таким образом, чтобы они использовали один и тот же ввод, поэтому, когда grep
завершает работу sed
берет на себя:
{ grep -B2 -m1 match1; sed '/match2/q'; } < infile
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
Попробуйте передать вывод команды grep
команде sed
? Например,
grep <options> file | sed <options>