提取每行括号之间的字符串

时间:2018-09-20 06:42:15

标签: bash awk sed

假设我有这样的文字:

a b [c] d [e]
f [g]
[h]
i j
k [l]

我想问一下如何使用sed或awk命令逐行提取括号之间的字符串吗?

输出应为:

c e
g
h

l

4 个答案:

答案 0 :(得分:2)

这可能对您有用(GNU sed):

sed -r 's/[^[]*(\[([^]]*)\])*( *)[^[]*/\2\3/g' file

答案 1 :(得分:1)

请您尝试以下。

awk '
{
  while(match($0,/\[[^\]]*/)){
    val=(val?val OFS substr($0,RSTART,RLENGTH):substr($0,RSTART,RLENGTH))
    $0=substr($0,RSTART+RLENGTH)
  }
}
{
  gsub(/\[|\]/,"",val)
  print val
  val=""
}
'  Input_file

解决方案2: ,带有简单的for循环解决方案。

awk '
{
  for(i=1;i<=NF;i++){
    if($i~/^\[.*\]/){
      gsub(/\]|\[/,"",$i)
      printf("%s%s",$i,i==NF?"":OFS)
    }
  }
  print ""
}
'  Input_file

输出如下。

c e
g
h

l

答案 2 :(得分:0)

使用awk .tgz并观察到每个偶数字段都需要打印:

npm install

输出:

FS="[][]"

解决方案希望没有未配对或嵌套的$ awk ' BEGIN { FS="[][]" } { for(i=2;i<=NF;i+=2) # get every other field separated by [ and ] b=b $i OFS # buffer them up, there will be a trailing OFS print b; b="" # output }' file

答案 3 :(得分:0)

另一个GNU awk:

awk -v RS='[][]' -F'\n' 'NR>1{printf("%s",((NR+1)%2?$0:" "));for(i=1;i<NF;i++){printf "\n"}}' file

记录分隔符RS设置为[]。这样就可以用数字记录NRNR+1%2捕获这些方括号之间的记录。

-Ffor语句根据输入文件打印换行符。