我想删除文件中的字符串,我要删除的字符串是
“/package/myname:
”。我尝试使用sed
来做到这一点,但不能。
请注意,字符串末尾有一个“/
”,字符串末尾有“:
”,我不知道如何处理。
e.g。我可以使用
删除“package/myname
”
echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\<package\/myname\>//g'
但是当我跑步时:
echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\<\/package\/myname\:\>//g'
结果不会取代任何东西。
在我的情况下删除“/ package / myname:”的正确方法是什么?
答案 0 :(得分:2)
<强>问题:强>
echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\<\/package\/myname\:\>//g'
^ ^
| |
问题主要是因为两个字的边界。
\<
- 在非单词字符和单词字符之间匹配的边界。
\>
- 在单词字符和单词字符以及非单词字符之间匹配的边界。
所以在第一种情况下,
echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\<package\/myname\>//g'
\<
字符串前的package
与/
(非单词字符)和p
(单词字符)之后的边界相匹配。同样,\>
匹配e
(单词字符)和:
(非单词字符)之间存在的边界。所以最后会发生匹配,匹配的字符将被空字符串替换。
但在第二种情况下,
echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\<\/package\/myname\:\>//g'
\<
无法匹配a
和正斜杠/
之间存在的边界,因为\<
仅匹配非单词字符( left )和一个单词字符( right )。同样,\>
无法匹配:
和/
正斜杠之间存在的边界,因为左侧没有单词字符,右侧没有非单词字符。
<强>解决方案:强>
因此,我建议您删除边界<\
和/>
。或者,你可以这样做,
$ echo 'diff a/package/myname:/src/com/abc' | sed -e 's/\>\/package\/myname\://g'
diff a/src/com/abc
我想现在你可以找出上述命令的工作原因。
答案 1 :(得分:1)
sed 's%/package/myname:%%g'
使用%
代替/
来标记替换命令各部分的结尾。您可以使用字符串中未出现的任何字符。使用 Control-A 作为分隔符非常有效。
你也可以使用:
sed 's/\/package\/myname://g'
但是当我有一种简单的方法可以避免它们时,我宁愿避免使用反斜杠。
答案 2 :(得分:1)
sed -i "s/\/package\/myname\://g;" [__YOUR_FILE_NAME__]
删除了短语。
不会删除该行。
grep -v # removes the line