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

时间:2012-02-09 11:44:45

标签: 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
如果字符串包含超过2位数,则

不起作用。

我该怎么做?

6 个答案:

答案 0 :(得分:1)

您的模式只允许一个字符,在模式后面添加一个星形会将其扩展为所有匹配的字符。

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

替代:

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

这意味着:在开始之后“[”除了“]”之外的所有内容都是正常的,并且对于那里有多少个字符(“*”)

进一步阅读sed:http://www.grymoire.com/Unix/Sed.html

答案 1 :(得分:1)

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

所以你基本上有两个选择:使用非贪婪的量词或限制你可以匹配的字符类型。您已尝试过第二种解决方案。我会选择使用否定的字符类:

sed 's/\[[^]]*\]//g'

我不确定sed是否有非贪婪的量词,但perl会这样做:

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

答案 2 :(得分:0)

逃避结束有帮助吗?

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

答案 3 :(得分:0)

您已获得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"

输出:

16:00 Al-Najma - Al-Rifaa 5.06 3.55 1.57 4

答案 4 :(得分:0)

使用awk

$ echo '16:00 [61]Al-Najma - Al-Rifaa [62]5.06 [63]3.55 [64]1.57 4' | awk -F '\[[0-9]*\]' '$1=$1'
16:00  Al-Najma - Al-Rifaa  5.06  3.55  1.57 4

答案 5 :(得分:0)

这可能对您有用:

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