【问题标题】:Convert line feeds to an actual string将换行符转换为实际字符串
【发布时间】:2014-12-28 03:44:38
【问题描述】:

我有一个这样的文件:

#!/bin/bash
echo $(date "+%F %R:%S") ":: yum update"
/usr/bin/yum update -y

我想把它转换成这个引用的字符串:

"#!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n"

我使用的任何方法都是匹配换行符,但将它们转换为换行符而不是“\n”。所以这些例子:

sed 's/\n/\n/g' file
sed 's/\n/\\\n/g' file
tr '\n' '\n' <file
tr '\n' "\n" <file

所有结果都与文件本身完全相同。那么如何匹配换行符并将其替换为实际字符串“\n”而不是本身会被识别为换行符的东西?

【问题讨论】:

    标签: regex awk sed string-matching tr


    【解决方案1】:

    在这里,您需要两个字符,斜杠和n,来替换单个换行符。因此,tr 不是一个好的选择。

    我不清楚您是否希望在双引号之前使用实际的反斜杠。下面的答案假设您这样做。如果你不这样做,那么删除这些替换就很简单了。

    使用awk

    $ awk '{gsub(/"/, "\\\""); printf "%s\\n",$0}' file
    #!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n
    

    使用sed

    $ sed ':again; N; $!b again; s/"/\\"/g; s/\n/\\n/g; s/$/\\n/' file
    #!/bin/bash\necho $(date \"+%F %R:%S\") \":: yum update\"\n/usr/bin/yum update -y\n
    

    【讨论】:

    • 我确实想要双引号前的反斜杠,谢谢。两个答案都有效
    【解决方案2】:

    Perl:

    perl -0777 -pe 's/\n/\\n/g; s/"/\\"/g' file
    

    tr 无法完成这项工作,因为它无法将一个字符 (\n) 转换为 2 字符字符串 (\n )。

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多