Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 提取每行括号之间的字符串_Bash_Awk_Sed - Fatal编程技术网

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

Bash 提取每行括号之间的字符串,bash,awk,sed,Bash,Awk,Sed,假设我有这样一个文本: a b [c] d [e] f [g] [h] i j k [l] 我想问一下如何使用sed或awk命令逐行提取括号之间的字符串 输出应为: c e g h l 你能试试下面的吗 awk ' { while(match($0,/\[[^\]]*/)){ val=(val?val OFS substr($0,RSTART,RLENGTH):substr($0,RSTART,RLENGTH)) $0=substr($0,RSTART+RLENGTH)

假设我有这样一个文本:

a b [c] d [e]
f [g]
[h]
i j
k [l]
我想问一下如何使用sed或awk命令逐行提取括号之间的字符串

输出应为:

c e
g
h

l

你能试试下面的吗

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
第二种解决方案:使用简单的
循环解决方案

awk '
{
  for(i=1;i<=NF;i++){
    if($i~/^\[.*\]/){
      gsub(/\]|\[/,"",$i)
      printf("%s%s",$i,i==NF?"":OFS)
    }
  }
  print ""
}
'  Input_file
使用awk,
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
解决方案要求不存在未配对或嵌套的
[]
s

这可能适用于您(GNU-sed):

另一个GNU awk:

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

awk-v RS='[]]'-F'\n''NR>1{printf(“%s”)((NR+1)%2?$0:);对于(i=1;iIt总是建议您也在您的帖子中添加您的努力,以解决您的问题。请这样做。
c e 
g 
h 

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