我正在使用sed
命令行来编辑文件。
这有效:
sed "1,/abc/d" file1.txt > file2.txt
它删除了 中的所有内容file1.txt
,包括abc
。
但事实并非如此:
sed "1,/abc-def/d" file1.txt > file2.txt
因为连字符应该是文字,所以
我使用转义符:
sed "1,/abc\-def/d" file1.txt > file2.txt
。但是它不起作用。sed
无法识别它。输出文件为空。我尝试使用通配符:
sed "1,/abc.def/d" file1.txt > file2.txt
。我使用括号:
sed "1,/abc[-]def/d" file1.txt > file2.txt
。我使用数字文字:
sed "1,/abc\D2def/d" file1.txt > file2.txt
。当然,我会用到所有能想到的转义字符组合。
但无论我做什么,sed
将不会识别文字连字符。它如何sed
知道我想做什么,以便它可以拒绝?这是量子力学的东西吗,就像只有我不检查结果时它才会这样做?真是令人困惑……
[明天]好的,我使用十六进制编辑器来验证它是否是连字符,ascii x2D,它是一个字符。为了好玩,我再次尝试只使用裸连字符,当然没有成功。我也检查了语言环境。它显示美国英语。
这是另一个很好的例子。它有效:sed "1,/abc/d" 文件1.txt > 文件2.txt
但这不行:sed "1,/\"abc/d" 文件1.txt > 文件2.txt即使我使用 ASCII 码 (\x22) 作为双引号,sed 无论如何都不会匹配它。我仍然没有理论,只是 sed 是有意识的并且知道我想做什么。
好的,谢谢 Kamil,你的例子sed "1,/abc-def/d"
确实有效。这个sed "1,/abc\-def/d"
也是: 还有这个:sed "1,/abc\x2Ddef/d"
我会很生气,看看这个。用我的自己的 文件1.txt这有效:sed "1,/balance/d" file1.txt > file2.txt
但这不行:sed "1,/\x22balance/d" file1.txt > file2.txt
这是 file1.txt 中的实际字符串:名称=“余额”兔子洞有多深?[\明天]
答案1
您说得对,您需要转义连字符。破折号(或连字符)用于指示范围,除非您将其转义。如果没有反斜杠,sed 不会将破折号解释为连字符。
在我看来,您没有正确地转义连字符。您需要在用作转义字符的字符前添加反斜杠。
sed "1,/abc\-def/d" file1.txt > file2.txt
这样才能正确地转义连字符。
点是任何单个字符的通配符,可以匹配任意多个字符。考虑这个命令:
echo "abc def abc.def abc-def abc+def abc++def" | sed -e "s/abc.def/+/g"
它将查找字符串“abcdef”并将其替换为“+”(“g”表示全局并替换行上的所有内容。)
+ + + + abc++def
现在,让我们将点改为转义的连字符:
echo "abc def abc.def abc-def abc+def abc++def" | sed -e "s/abc\-def/+/g"
答案正是您想要的:
abc def abc.def + abc+def abc++def
注意:在此示例中,为了清晰起见,我将所有条目放在一行上,并添加了“g”参数。
在您的示例中,由于您是在行上工作,而不是在每行上处理单词,因此您不需要“g”
答案2
问题出在文件1.txt我用来输入的。一个 28k 的文本文件,包含 14 行文本。第 14 行超过 13k 长,所以当我使用
sed "1,/abc/d" file1.txt > file2.txt
目标字符串位于文件的中间,但它位于最最后的记录。我误读了输入文件的结构。Sed 正在执行其工作,排除目标行之前的每一行(包括目标行)。输出文件,文件2.txt,是空的,我不知道为什么。感谢大家的帮助。我应该说真正的问题是无能。我给了当地驱魔人一笔丰厚的小费,然后送他走了。