output.txt 其中 input.txt 是: test1234fo-6ren">
gpt4 book ai didi

regex - 在 sed 中插入换行符 (Mac OS X)

转载 作者:行者123 更新时间:2023-11-29 08:41:24 26 4
gpt4 key购买 nike

如何在 sed 的替换部分插入换行符?

此代码无效:

sed "s/\(1234\)/\n\1/g" input.txt > output.txt

其中 input.txt 是:

test1234foo123bar1234

和 output.txt 应该是:

test
1234foo123bar
1234

但我明白了:

testn1234foo123barn1234

注意:

这个问题专门针对 Mac OS X 版本的“sed”,社区已经注意到它的行为不同于 Linux 版本。

最佳答案

您的 sed 版本显然不支持 \n在 RHS 中(替换的右侧)。你应该阅读 THE SED FAQ由 Eric Pement 维护以选择一种可能的解决方案。我建议先尝试插入文字换行符。

下面是它的引述。


4.1。如何在替换的 RHS 中插入换行符?

几个版本的sed permit \n直接输入 RHS,然后在输出时转换为换行符:ssed、gsed302a+、gsed103(使用 -x 开关)、sed15+、sedmod 和 UnixDOS sed。最简单的解决方案是使用这些版本之一。

对于其他版本的 sed,请尝试以下操作之一:

(a) 如果从 Bourne shell 中键入 sed 脚本,请使用一个反斜杠 \如果脚本使用“单引号”或两个反斜杠 \\如果脚本需要“双引号”。在下面的示例中,请注意前导 >第二行由 shell 生成,提示用户进行更多输入。用户输入斜杠、单引号,然后输入 ENTER 以终止命令:

 [sh-prompt]$ echo twolines | sed 's/two/& new\
>/'
two new
lines
[bash-prompt]$

(b) 使用带有一个反斜杠的脚本文件 \在脚本中,紧接着是换行符。这会将换行符嵌入到“替换”部分。示例:

 sed -f newline.sed files

# newline.sed
s/twolines/two new\
lines/g

某些版本的 sed 可能不需要结尾的反斜杠。如果是这样,请将其删除。

(c) 插入一个未使用的字符并通过 tr 管道输出:

 echo twolines | sed 's/two/& new=/' | tr "=" "\n"   # produces
two new
lines

(d) 使用 G命令:

G 附加一个换行符,加上保持空间的内容到模式空间的末尾。如果保留空间为空,则无论如何都会附加一个换行符。换行符在模式空间中存储为 \n可以通过分组 \(...\) 来解决并搬进了 RHS。因此,要更改之前使用的“双线”示例,可以使用以下脚本:

 sed '/twolines/{G;s/\(two\)\(lines\)\(\n\)/\1\3\2/;}'

(e) 插入整行,而不是打断行:

如果不更改行而只是在模式之前或之后插入完整的行,则过程要容易得多。使用 i (插入)或 a (附加)命令,通过外部脚本进行更改。插入 This line is new在匹配正则表达式的每一行之前:

 /RE/i This line is new               # HHsed, sedmod, gsed 3.02a
/RE/{x;s/$/This line is new/;G;} # other seds

以上两个示例旨在作为从控制台输入的“单行”命令。如果使用 sed 脚本,i\紧跟文字换行符将适用于所有版本的 sed。此外,命令 s/$/This line is new/仅当保留空间已经为空(默认情况下为空)时才有效。

追加This line is new在每行匹配正则表达式之后:

 /RE/a This line is new               # HHsed, sedmod, gsed 3.02a
/RE/{G;s/$/This line is new/;} # other seds

在匹配正则表达式的每行后追加 2 个空行:

 /RE/{G;G;}                    # assumes the hold space is empty

用 5 个空行替换与正则表达式匹配的每一行:

 /RE/{s/.*//;G;G;G;G;}         # assumes the hold space is empty

(f) 使用 y///如果可能的话命令:

在某些 Unix 版本的 sed(不是 GNU sed!)上,尽管 s///命令不会接受 \n在 RHS 中,y///命令确实如此。如果你的 Unix sed 支持它,在 aaa 之后换行可以这样插入(不能移植到 GNU sed 或其他 seds):

 s/aaa/&~/; y/~/\n/;    # assuming no other '~' is on the line!

关于regex - 在 sed 中插入换行符 (Mac OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6111679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com