shell替换换行符为实际的字符

levinit

可能存在更新版本,参看我的笔记


shell下处理文件时,有时候有替换或去掉\n换行符号的需求。
今天我遇到了将换行符号替换成实的\n字符的需求,有点绕,示例,一篇文章内容为:

line1
line2

需要将其内容变成一行,所有换行符变成字符\n,如下:
line1\nline2

如果直接用

sed -i "s/\n/\\\n/"  #\\\n转义 为\n字样

我们会发现替换不了,因为sed每次处理完毕一行后有自动添加一行(白忙活.jpg),如之奈何?

如果你sed技能熟练一点,知道分支和模式空间,这就好说啦:

sed ":tag;N;s/\n/\\\n/;b tag" file  #tag只是一个标签名随意

是有点头大。说个容易懂的方法吧,利用echo不使用-e时自动去掉换行符的特点:

echo $(sed "$ ! s/$/\\\n/" flie) > file

$表示行匹配中的最后一行,$ !即使取反,表示不匹配最后一行;
/$/不用说,学过正则就知道这是匹配行尾之意,这个命令意思是:

  1. 将行尾(出了最后一行)变成\n(注意这里是实际的字符\n,转义过了,没有换行符的特殊意义了)。于是有了:

    line1\nline2
  2. sed帮倒忙给你加上\n换行符,于是有了:

    line1\n
    line2
  3. echo输出自动去掉换行,于是有了line1\nline2

当然,如果只想将换行符号换成空格,那就简单了echo $(cat file)即可。

阅读 10.7k

我的linux不可能这么可爱
linux相关的日常(可能以及工作)的相关记录。 一个99.99%日常使用archlinux,chromeos,debian,工作ce...

linux fans

515 声望
4 粉丝
0 条评论

linux fans

515 声望
4 粉丝
文章目录
宣传栏