我有一个这种类型的文件:
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位数,则不起作用。
我该怎么做?
答案 0 :(得分:1)
您的模式只允许一个字符,在模式后面添加一个星形会将其扩展为所有匹配的字符。
sed 's/\[.[1234567890]]*//g' file1 > file2
替代:
sed 's/\[^\]*//g' file1 > file2
这意味着:在开始之后“[”除了“]”之外的所有内容都是正常的,并且对于那里有多少个字符(“*”)
答案 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