SED:在同一行中的两个模式之间组合文本

时间:2013-02-26 07:16:08

标签: sed awk

我正在尝试使用sed / awk命令来解析我的文本文件。 我想在同一行中的两个模式之间打印文本,并在其中添加一些字符。 例如: 如果我的行是

uint8_t aucRepresentationName[NR_UNIT_REPRESENTATIONS][CHARS_P_REPRESENTATION];

OR

uint8_t aucRepresentationName [NR_UNIT_REPRESENTATIONS] [CHARS_P_REPRESENTATION];

我想打印NR_UNIT_REPRESENTATIONS*CHARS_P_REPRESENTATION

所以,我已经开始使用sed命令在\n之后插入行分隔符'[',在合适的物种中划分行,然后再尝试解析它。

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | awk '{sub(/.*\[ /,"");sub(/\].*/,"");print;}'

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/\[/\n&/g;' | sed -e 's/^.*\[ //g;s/ \].*$//g'

它并不总是两个d维数组,它可能是无或单/双维数组,我需要首先有多少[]的实例,如果它的0然后写1,如果它的单个数据然后是前A [ SIZE]然后写SIZE它的两个diamensional数组ex:A [RAW] [COL]写RAW * COL ..

我想知道我的命令有什么问题?或任何其他选择,因为它将帮助我进一步研究sed。

Amruta

4 个答案:

答案 0 :(得分:1)

使用它:

perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}'

here修改 测试如下:

> echo "bla [AK] bla [A_K] 10" | perl -lne 'push @a,/\[([^\]]*)\]/g;END{print join "*",@a}'
AK*A_K

答案 1 :(得分:1)

尝试:

awk -F '[][]' '{print $2,$4}' OFS=\* file

好的,如果在一个页面中出现0,1或二维,您可以尝试:

awk -F '[][]' '{if(NF==3)print $2; else if(NF>4)print $2,$4; else print 1}' OFS=\* file

或更不易理解;):

awk -F '[][]' '{$0=NF==3?$2:NF>4?$2 OFS $4:1}1' OFS=\* file

答案 2 :(得分:1)

您可以尝试以下操作:

echo "bla bla bla [AK] bla bla bla bla [A_K] bla bla bla" | sed 's/.*\[\(.*\)\].*\[\(.*\)\].*/\1*\2/g'
  

AK * A_K

答案 3 :(得分:0)

使用sed:

sed -n 's/[^]]*\[\([^]]*\)\]\s*\[\([^]]*\)\].*$/\1*\2/p' input