使用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'