如何删除文件中的这个字符串
How to remove this string in file
我要删除一个文件中的字符串,我要删除的字符串是
“/package/myname:
”。我尝试使用 sed
来做到这一点,但不能。
请注意,字符串开头有一个“/
”,字符串结尾有一个“:
”,我不知道如何处理。
例如我能够使用以下方法删除“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:”的正确方法是什么?
sed 's%/package/myname:%%g'
使用 %
而不是 /
来标记替换命令部分的结尾。您可以使用字符串中未出现的任何字符。使用 Control-A 作为分隔符会非常有效,甚至
您还可以使用:
sed 's/\/package\/myname://g'
但我更愿意避免乱用反斜杠,因为有一种简单的方法可以避免它们。
sed -i "s/\/package\/myname\://g;" [__YOUR_FILE_NAME__]
删除短语。
不删除行。
grep -v # removes the line
问题:
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
我想你现在可以找出上述命令起作用的原因了。
我要删除一个文件中的字符串,我要删除的字符串是
“/package/myname:
”。我尝试使用 sed
来做到这一点,但不能。
请注意,字符串开头有一个“/
”,字符串结尾有一个“:
”,我不知道如何处理。
例如我能够使用以下方法删除“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:”的正确方法是什么?
sed 's%/package/myname:%%g'
使用 %
而不是 /
来标记替换命令部分的结尾。您可以使用字符串中未出现的任何字符。使用 Control-A 作为分隔符会非常有效,甚至
您还可以使用:
sed 's/\/package\/myname://g'
但我更愿意避免乱用反斜杠,因为有一种简单的方法可以避免它们。
sed -i "s/\/package\/myname\://g;" [__YOUR_FILE_NAME__]
删除短语。
不删除行。
grep -v # removes the line
问题:
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
我想你现在可以找出上述命令起作用的原因了。