省略引用之间的编辑“&引用;在sed中

省略引用之间的编辑“&引用;在sed中,sed,Sed,因此,我有一个文件,它调用多个sed命令对文档进行许多格式更改。 除了引号中的字符串外,有没有其他方法可以对所有内容进行更改 例如,如果我的文件中有一行内容为“hello world”hello world“hello world”hello world和一条将hello to bye和world to universe更改为bye的命令,我将如何提供输出bye universe“hello world”bye universe,而不是bye universe“bye universe”bye

因此,我有一个文件,它调用多个sed命令对文档进行许多格式更改。 除了引号中的字符串外,有没有其他方法可以对所有内容进行更改

例如,如果我的文件中有一行内容为“hello world”hello world“hello world”hello world和一条将hello to bye和world to universe更改为bye的命令,我将如何提供输出
bye universe“hello world”bye universe
,而不是
bye universe“bye universe”bye universe

另外,我如何考虑跨越多行的引用文本?


注意:我必须在sed中完成这一切

此命令将
hello world
替换为
bye universe
,但仅当
hello world
前面有双引号的偶数(如0、2、4等)

让我们在您的测试输入上尝试以下操作:

$ cat file
hello world "hello world" hello world 
$ sed -E ':a; s/^(([^"]*"[^"]*")*[^"]*)hello world/\1bye universe/; ta' file
bye universe "hello world" bye universe 
让我们尝试一个包含多个引号的更复杂的测试用例。在这里,我们将
one
替换为
one

$ cat file2
this one said "one." one what? "one sub," he said, one.
$ sed -E ':a; s/^(([^"]*"[^"]*")*[^"]*)one/\1ONE/; ta' file2
this ONE said "one." ONE what? "one sub," he said, ONE.
工作原理
  • -E
    打开扩展正则表达式语法,因此我们需要更少的转义

  • :a
    创建一个名为
    a
    的标签

  • s/^(([^”]*“[^”]*”*[^”]*)hello world/\1bye universe/
    进行替换。此处的
    ^(([^“]*”[^“]*”*[^“]*)
    匹配任何从具有偶数引号的行开头开始的字符串。因为它被括在括号中,所以此字符串保存为组1,以便我们可以在替换文本中将其作为
    \1
    引用

  • ta
    告诉sed如果发生替换,请跳回标签
    a
    。这会导致sed根据需要重复替换命令多次,以进行我们需要的所有替换

兼容性
此代码是在GNU上开发和测试的
sed

此命令将
hello-world
替换为
bye-universe
,但仅当
hello-world
前面有双引号的偶数(如0、2、4等)

让我们在您的测试输入上尝试以下操作:

$ cat file
hello world "hello world" hello world 
$ sed -E ':a; s/^(([^"]*"[^"]*")*[^"]*)hello world/\1bye universe/; ta' file
bye universe "hello world" bye universe 
让我们尝试一个包含多个引用的更复杂的测试用例。在这里,我们将
one
替换为
one

$ cat file2
this one said "one." one what? "one sub," he said, one.
$ sed -E ':a; s/^(([^"]*"[^"]*")*[^"]*)one/\1ONE/; ta' file2
this ONE said "one." ONE what? "one sub," he said, ONE.
工作原理
  • -E
    打开扩展正则表达式语法,因此我们需要更少的转义

  • :a
    创建一个名为
    a
    的标签

  • s/^(([^”]*“[^”]*”[^”]*)*[^”]*)hello world/\1bye universe/
    进行替换。此处的
    ^(([^”]*“[^”]*”[^”]*)
    匹配从具有偶数引号的行开头开始的任何字符串。因为它被括在括号中,所以该字符串保存为组1,以便我们可以在替换文本中将其引用为
    \1

  • ta
    告诉sed如果发生替换,则跳回标签
    a
    。这会导致sed根据需要多次重复替换命令,以进行我们需要的所有替换

兼容性
此代码是在GNU
sed
上开发和测试的。调用多个sed命令的文件通常不是一个好主意,您可能只需要调用一次awk或类似的命令。如果你想得到帮助,那就发一个新问题

在任何情况下,对于当前的问题,在每个UNIX设备上的任何shell中使用任何awk都可以:

$ awk 'BEGIN{FS=OFS="\""} {for (i=1; i<=NF; i+=2) sub(/hello world/,"bye universe",$i)} 1' file
bye universe "hello world" bye universe

$awk'BEGIN{FS=OFS=“\”}{for(i=1;i
调用多个sed命令的文件通常不是一个好主意,您可能只需要调用一次awk或类似的命令。如果您需要这方面的帮助,请发布一个新问题

在任何情况下,对于当前的问题,在每个UNIX设备上的任何shell中使用任何awk都可以:

$ awk 'BEGIN{FS=OFS="\""} {for (i=1; i<=NF; i+=2) sub(/hello world/,"bye universe",$i)} 1' file
bye universe "hello world" bye universe

awk'BEGIN{FS=OFS=“\”}{for(i=1;i
echo'hello world“hello world”hello world“hello world”sed s'/\([^“]*\)\(“*”)\(.\)/bye universe\2 bye universe/'
是的,我知道这对于一行的单个替换是有效的,但是如果在多行文档中执行了许多命令,我不知道该怎么办,并且我需要在查看所有命令之前省略引号them@vdizzle如果你不能从你的简单例子中推断出一个解决方案所有世界的数据,您需要改进您的问题。请编辑您的问题以更好地代表您的现实世界问题和/或提供您的实际数据样本。
echo'hello world“hello world”hello world“hello world”sed s'/\([^“]*\(“*”\)\(*)/bye universe\2 bye universe/'
是的,我知道这对于一行的单个替换是有效的,但是如果在多行文档中执行了许多命令,我不知道该怎么办,并且我需要在查看所有命令之前省略引号them@vdizzle如果你不能从你的简单例子中推断出一个解决方案al world的数据,您需要改进您的问题。请编辑您的问题,以更好地代表您的现实世界问题和/或提供您的实际数据样本。做得好。这很巧妙。成功替换的分支是救世主,这是我在看到解决方案之前经常忽略的。您应该提到,这只适用于GNUed.即使是OSX/BSD sed(另一个具有
-E
的sed版本)也无法使用该脚本。做得好。这很巧妙。成功替换的分支是一个救世主,这是我在看到解决方案之前经常忽略的一点。您应该提到的是,这只适用于GNU sed。即使是OSX/BSD sed(另一个具有
-E
)的sed版本将无法使用该脚本。