省略引用之间的编辑“&引用;在sed中
因此,我有一个文件,它调用多个sed命令对文档进行许多格式更改。 除了引号中的字符串外,有没有其他方法可以对所有内容进行更改 例如,如果我的文件中有一行内容为“hello world”hello world“hello world”hello world和一条将hello to bye和world to universe更改为bye的命令,我将如何提供输出省略引用之间的编辑“&引用;在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
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根据需要多次重复替换命令,以进行我们需要的所有替换
兼容性
此代码是在GNUsed
上开发和测试的。调用多个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;iecho'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版本将无法使用该脚本。