Если у вас есть GNU awk
, Вы можете сделать что-то с гораздо больше контроля. Для этого вам понадобится построить match(source,/regex/,array)
.
Пример:
Ввод пробы для испытания:
echo "$x"
p1=aaa,p2=bb,p3=cc,p4=dd,p5=ee,p6=ff,p7=gg,p8=hh,p9=ii,p10=jj
sed
работает отлично до \9
:
echo $x |sed -r 's/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+)(.*)/\1 \2 \3 \4 \5 \6 \7 \8 \9/'
aaa bb cc dd ee ff gg hh ii
sed
сломал, когда \10
добавляется, то считается, является \1
+ 0
.
echo $x |sed -r 's/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+).*p10=([^,]+)(.*)/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10/'
aaa bb cc dd ee ff gg hh ii aaa0
awk
, чтобы спасти, когда любая обратная ссылка добавлено более 9 добавляется. Здесь добавлен 10-й refrence:
echo "$x" |awk '{match($0,/p1=([^,]+).*p2=([^,]+).*p3=([^,]+).*p4=([^,]+).*p5=([^,]+).*p6=([^,]+).*p7=([^,]+).*p8=([^,]+).*p9=([^,]+).*p10=([^,]+)(.*)/,a);print a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10]}'
aaa bb cc dd ee ff gg hh ii jj
Вы можете использовать практически любой язык сценариев, который позволяет писать для этого однострочные. `perl -pe 's/yourregexhere/$ 1 $ 2 $ 3 $ 4 $ 5 $ 6 $ 7 $ 8 $ 9 $ 10 /'` – 2010-11-30 20:19:11
Вполне возможно, что вы можете использовать более простое регулярное выражение, которому не нужно много обратных ссылок. Если вы покажете примерные данные и пример нужного результата, мы, возможно, покажем вам более простой способ. – 2010-11-30 21:10:06