sed 无法解释文字连字符

sed 无法解释文字连字符

我正在使用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,是空的,我不知道为什么。感谢大家的帮助。我应该说真正的问题是无能。我给了当地驱魔人一笔丰厚的小费,然后送他走了。

相关内容