6

我有一个文件,其中包含\n的几个实例。

我想用实际的换行符替换它们,但 sed 无法识别\n

我试过了

sed -r -e 's/\n/\n/'
sed -r -e 's/\\n/\n/'
sed -r -e 's/[\n]/\n/'

以及许多其他逃避它的方法。

sed 能够识别文字\n吗?如果是这样,如何?

是否有另一个程序可以读取将\n解释为真正的换行符的文件?

4

5 回答 5

9

你能试试这个吗

sed -i 's/\\n/\n/g' input_filename
于 2013-11-04T05:55:04.550 回答
1

确切的工作取决于您的sed实施。这在 POSIX 中没有明确规定,因此您会看到各种行为。

-r选项也不是 POSIX 标准的一部分;但是您的脚本没有使用任何-r功能,所以让我们把它拿出来。(对于它的价值,它将匹配表达式中支持的正则表达式方言从 POSIX“基本”正则表达式更改为“扩展”正则表达式;一些sed变体具有-E执行相同操作的选项。简而言之,诸如捕获括号和重复大括号之类的事情是“扩展”功能。)

在 BSD 平台(包括 MacOS)上,您通常需要反斜杠文字换行符,如下所示:

sed 's/\\n/\
/g' file

在其他一些系统上,比如 Linux(也取决于sed安装的精确版本——一些发行版使用 GNU sed,另一些更喜欢更传统的东西,还有一些让你选择)你可以\n在替换字符串中使用文字来表示实际换行符;但同样,这是非标准的,因此不可移植。

如果您需要一个可移植的解决方案,可能会使用 Awk 或(喘气)Perl。

perl -pe 's/\\n/\n/g' file

如果您无权访问手册,则该/g标志表示要替换一行中的每个匹配项;该s///命令的默认行为是仅替换每一行的第一个匹配项。

于 2021-08-20T07:18:58.097 回答
0
  1. sed一次工作一行,因此\n仅在 1 行上不工作(在读取时将其删除sed到缓冲区中)。您应该使用N,nH,h用多行填充缓冲区,然后\n出现在里面。小心,由于内部^$不再是行尾而是字符串/缓冲区的结尾\n
  2. \n在搜索模式中被识别,而不是在替换模式中。两种使用方式(示例):
    sed s/\(\n\)bla/\1blabla\1/
    sed s/\nbla/\
    blabla\
    /
    
    第一个使用\n已经在内部作为后向引用(替换模式中的代码较短);第二个使用真正的换行符。

所以基本上

sed "N
$ s/\(\n\)/\1/g
"

有效(但有点没用)。我想这s/\(\n\)\n/\1/g更像是你想要的。

于 2013-11-04T10:37:11.393 回答
0

awk似乎处理得很好:

echo "test \n more data" | awk '{sub(/\\n/,"**")}1'
test ** more data

在这里你需要逃避\使用\\

于 2013-11-04T06:23:43.943 回答
0
$ echo "\n" | sed -e 's/[\\][n]/hello/'
于 2013-11-04T06:05:48.690 回答