用sed 怎么替换包含换行符\n的文本.比如这些

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用sed 怎么替换包含换行符\n的文本.比如这些相关的知识,希望对你有一定的参考价值。

参考技术A 因为sed是按行处理文本的,每次只读入一行到内部模式空间 参考技术B sed只能按行处理

sed 去掉所有的换行符

sed 替换所有的换行符,命令如下


echo -e "hello\\nworld" | sed ':label;N;s/\\n//g;b label'

  • :label; 定位标签,用来实现跳转处理,名字随便取(label),后面的b label就是跳转指令
  • N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,设定换行符可见
  • s/\\n//g; s是sed的替换命令,将换行符替换为冒号
  • b label 或者 t label b / t 是跳转命令,跳转到指定标签

上述命令不支持在 Mac 上运行(暂时没找出原因)。下面这个可以,只是更复杂一点


echo -e "hello\\nworld" | sed -n -e 'H;$x;s/\\n//g;p;'

-n 这个参数是必须的,去掉的话会输出每行的处理结果,当然,也可以通过不加这个参数,来看这行命令是怎么工作的
$ 表示最后一行
... 表示一个函数组
H; 将 pattern 空间的内容加到 hold 空间
x; 交换 pattern 空间和 hold 空间的内容
p; 将模式空间的内容输出到标准输出

这里涉及到了两个概念:模式空间(pattern space) 和 储存空间(hold space)。大概理解就是,sed 是一行一行处理文本的,模式空间用于临时存储每一行处理后的文本,在“处理”的过程中,可以通过 function 把模式空间的内容先存储到储存空间,上面的 H 就是干这个事的;之后又可以通过 x 等 function 把储存空间的东西移到模式空间里来继续处理。

这个命令的意思就是:

  • 首先通过 H 函数把一行的文本存储到储存空间;
  • $ 表示只有最后一行才执行接下来的 ... 函数组,这样,每一行的内容就都去了储存空间;
  • 到了最后一行,开始执行函数组,首先通过 x 函数把储存空间的东西移到模式空间;
  • 通过 s/\\n//g 这个替换函数把换行符替换掉;
  • 最后是 p 函数把模式空间的东西输出来,结束。

这个命令也可以在 Linux 上运行。

以上是关于用sed 怎么替换包含换行符\n的文本.比如这些的主要内容,如果未能解决你的问题,请参考以下文章

Solaris里面的sed怎样把指定字符替换成换行

新手用bash的sed这样替换怎么不成功呢?

如何使用 vi or sed 将文件中的“\n" 替换成“\r\n

shell中如何把回车换行置换成半角空格?

如何使用vim,用换行替换文本中第4n个空格,n=1,2,3,4............

sed多行模板替换