Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
使用sed删除两个字符之间的字符串_Sed_Awk - Fatal编程技术网

使用sed删除两个字符之间的字符串

使用sed删除两个字符之间的字符串,sed,awk,Sed,Awk,我有一个这种类型的文件: 16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4 我想删除方括号内的所有字符串,以获得 16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4 我正以这种方式尝试sed: sed 's/\[.*]//g' file1 > file2 但我得到 16:00 1.57 4 和 sed 's/\[.[1234567890]]//g' file1 > file2

我有一个这种类型的文件:

16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4
我想删除方括号内的所有字符串,以获得

16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4
我正以这种方式尝试sed:

sed 's/\[.*]//g' file1 > file2
但我得到

16:00 1.57 4

sed 's/\[.[1234567890]]//g' file1 > file2
如果字符串包含超过2位数字,则不起作用


我如何才能做到这一点?

您的图案只允许一个字符,在图案后面添加星号会将其加宽到所有匹配的字符

sed 's/\[.[1234567890]]*//g' file1 > file2
备选方案:

sed 's/\[^\]*//g' file1 > file2
这意味着:在开始“[”之后,除了“]”之外的所有字符都是可以的,并且对于所出现的所有字符(“*”)都可以


有关sed的进一步阅读:

跳过结束]有帮助吗

sed 's/\[.*\]//g' file1 > file2

您已经得到了
sed
答案,因此我将使用
awk
添加另一个答案:

awk '
  BEGIN { 
    FS = "\\[[^]]*\\]"; 
    OFS = " " 
  } 
  { 
    for (i=1; i<=NF; i++) 
      printf "%s", $i 
  } 
  END { 
    printf "\n" 
  }
' <<<"16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4"
使用
awk

这可能适合您:

echo "16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4" |
sed 's/\[[^]]*\]//g'
16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4

第一个正则表达式不起作用,因为量词
*
是贪婪的,这意味着它匹配尽可能多的字符。由于
也匹配括号,因此它将继续匹配,直到找到最后一个结束括号
]

因此,基本上有两种选择:使用非贪婪量词或限制可以匹配的字符类型。您已经尝试了第二种解决方案。我会改为使用否定字符类:

sed 's/\[[^]]*\]//g'
我不确定sed是否有非贪婪量词,但perl有:

perl -lpwe 's/\[.*?\]//g'

与我的解决方案相同(未发布);)顺便说一句,两个“\”可以保存。这可能适用于此解决方案,但不适用于两个字符之间的所有类型的字符串。另一种选择?[1234567890]可以缩短为[0-9]
\[.\]
是贪婪的,它会吞掉第一个
[
和最后一个
]
之间的所有字符,包括其他
][
字符。
sed 's/\[[^]]*\]//g'
perl -lpwe 's/\[.*?\]//g'