在Mac上使用sed将换行符替换为字符串

4
在一个文件中,我需要将所有的换行符(不是转义序列'\n',而是实际的换行符)替换为一个字符串。我在SO上找到的所有问题都是反过来的,即用一个字面换行符替换一个字符串。这是在Mac上进行的。
我已经尝试了以下方法:
sed -i '' 's/\
/STOP/g' file.txt

但是它给我一个“未终止的替代模式”错误。

sed命令一次只能处理一行文本,因此该行中没有换行符。您应该加载多行(N、h/H g/x等)以处理多行文本。您的sed操作是正确的,可以尝试使用双引号或-e 's/\n/STOP/g' - NeronLeVelu
1个回答

5

虽然使用sed也可以完成,但使用awk更简单:

awk -v ORS='STOP' '1' file

将输出记录分隔符更改为STOP,而不是默认值\n

更新:以下是在OSX上执行相同操作的sed版本:

sed -i.bak -n -e 'H;${x;s/\n/STOP/g;p;}' file

这只是将文件输出到命令行而不更改实际文件。我该如何保存对文件的编辑? - qazwsx988
对于awk,您可以执行以下操作:awk -v ORS='STOP' '1' file > _tmp && mv _tmp file,而sed将进行内联编辑。 - anubhava
太棒了!你能快速解释一下sed版本吗?我以前从未见过在sed中使用H;${x;;p;} - qazwsx988
1
-n 会抑制默认输出。H - 在模式空间后面添加一个换行符和保持空间的内容。x - 交换模式空间和保持空间的内容。g - 用保持空间的内容替换模式空间的内容。p - 将模式空间写入标准输出。${...} 表示仅在最后一行执行该块。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接