用sed替换特殊文本?


3


我在Windows Xp上使用CMD用Sed替换特殊文本。我正在使用此命令替换特殊字符,例如$ or *

sed -i "s/\*/123/g;" 1.txt

但是我必须使用命令来替换ciao!我的文本文件中的这些字符串?有可能吗?

\\
\\\
""
sed.exe -i "s/{\*)(//123/
sed -i "s/\\/123/g;" 1.txt

上一个命令不起作用,因为我有\"以及sed用于制作正则表达式的其他特殊字符串。


请举一个源字符串和所需目标字符串的示例。例如:我想转*/123"ciao!"
Synetech

我想转 sed -i^/\\*$/$[{" ;" 1.txtCiao!
user143822

您希望源字符串包含实际的sed 命令吗?o.O
Synetech

是的,我想用特殊字符串替换sed命令到我的文本文件中。
user143822

在你的问题中你根本没有“sed”,你使用了“123”。您应该编辑您的问题,以使用您的实际示例字符串替换源字符串。
Synetech于

Answers:


5

查找具有正则表达式的文字字符串,当搜索字符串包含特殊字符时,有时不像查找模式那么简单,但您可以通过一些杂耍来实现。

注意:该echo命令必须适合CMD特殊字符,因此它需要^^转义单个^^|转义|... ^如果直接键入文件,则不需要CMD的转义字符。


步骤1:创建一个名为literal-srch-strings.txt的文件,其中包含要替换的确切(未更改)字符串。有两种方法可以创建此文件:

  1. 作为在CMD的命令行发出的命令,或作为.cmd / .bat 命令脚本中的命令

    echo sed -i^^/\\*$/$[{" ;"> literal-srch-strings.txt

  2. 使 字面-RCH-strings.txt自己,在你的文本编辑器。
    在这种情况下,您不应该使用CMD-escape-character ^,因此该行只有一个^,而不是^^- 这是因为您绕过了CMD-shell。
    这是.txt文件中需要的内容(就像文件名所示:)

    sed -i^/\\*$/$[{" ;"


步骤2:创建一个名为str-to-regex.sedsed脚本, 将字符串转换为sed regex(s)。 请注意,相同的CMD-escape-character问题适用于此步骤,因此,有两种方法可以创建.sed文件:
^

  1. 作为命令:

    echo s/[]\/$*.^^^|[]/\\^&/g; s/.*/s\/^&\/Ciao!\/g/> str-to-regex.sed

  2. 使用文本编辑器创建一个名为str-to-regex.sed的文件,其中包含:

    s/[]\/$*.^|[]/\\&/g; s/.*/s\/&\/Ciao!\/g/


步骤3:运行sed-script,将字符串转换为sed regeular表达式,
并将其输出发送到另一个sed脚本,replace-text.sed,这将进行实际替换。

sed -f str-to-regex.sed  literal-srch-strings.txt > replace-text.sed

第4步:运行replace-text.sed - 对于测试,我们可以使用literal-srch-strings.txt作为输入文件,但您当然可以使用任何输入文件。

sed -f replace-text.sed  literal-srch-strings.txt

这是输出:

Ciao! 

很难..我也试试 - > echo'“{*)(// 123 / $$'sed -i”s / [\“] [{] [\\] [*] [)] [( ] [/] [/] 123 [/] [$] [$] / xx
/“1.txt

1
这很难,因为你的例子是一个棘手的模式。这并不难,一旦你感觉到它,但你可能会发现像这样的杂耍文本在bash shell中更容易,而不是CMD-shell ..你可能会有兴趣尝试cygwin(它提供给你一个窗口类似于CMD,但运行速度bash多少比CMD更灵活。
Peter.O

彼得,我试着按照你的步骤,但我犯了一些错误,你能帮帮我吗?看看我的视频请nathan3000.altervista.org/Test_Vari/sedx.htm
user143822

需要注意的是第2步将满足任何输入字符串(不只是你的例子字符串)......但是,如果你使用任何这三个字符在替换字符串 &/\​,你必须转义为\&\/\\​分别。
彼得.O

谢谢你的回复,我现在尝试,但我仍然有问题。使用CMD命令:at echo s /[]\/$*.^^^ | [] / \\&/ g; s /.*/ s \ / ^&\ / Ciao!\ // g> str-to-regex.sed cmd给我错误:'/ g'不被识别为内部或外部命令。在sed -f str-to-regex.sed literal-srch-strings.txt使用两种方法(cmd和手动创建文件)> replace-text.sed cmd给我这个错误sed:file str-to-regex.sed line 1:
unterminated

0

要覆盖命令行(或批处理文件中的行)中特殊字符的含义,请使用^(克拉)字符对其进行转义。要输入文字克拉字符,请连续使用其中两个字符。


这样替换字符串的确切命令是什么sed.exe -i "s/{\*)(//123/$$
user143822

@ user143822:我从反斜杠和美元符号开始(假设报价不仅仅是评论中显示的独立报价,如果是,也是如此)。
martineau

嗯......这个命令是什么? sed.exe -i "/{^\*)(//123/^$^$?虽然我用@sed -i "s@sed.exe -i "/{^\*)(//123/^$^$@Ciao!@g; 1.txt
user143822

1
@ user143822:试试^"{^\*)(//123/^$^$。您也可以尝试echo使用您尝试使用的任何内容来了解​​错过的内容。
马蒂诺

@ user143822:您可能还需要在想要传递sed的所有内容周围加上引号,例如"^"{^\*)(//123/^$^$"
马蒂诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.