【问题标题】:How do I add a literal newline character while using sed's string replace?如何在使用 sed 的字符串替换时添加文字换行符?
【发布时间】:2013-12-13 10:35:57
【问题描述】:

让我解释一下我所面临的情况:我有一个 perl 文件,其中包括创建另一个进程使用的“标题”字符串。这在 perl 脚本 (script.pl) 中定义为:

$str = "START\n" .
"PARAM1=blah\n" .
"PARAM2=blah2\n" .
"PARAM3=blah3\n";

我需要通过从 bash 脚本中附加更多值来修改 $str 的值,所以我想我会使用 sed。这是我目前所拥有的:

str_new="\"NEWPARAM1=blah\" .\n\"NEWPARAM2=blah2\" .\n";
sed -i "/START/{n;s/^/$str_new/}" script.pl

这种作品,我得到的是:

$str = "START\n" .
       "NEWPARAM1=blah" .
       "NEWPARAM2=blah2" .
       "PARAM1=blah\n" .
       "PARAM2=blah2\n" .
       "PARAM3=blah3\n";

但是,我需要的是在我添加的新参数之后出现的文字 '\n':

$str = "START\n" .
       "NEWPARAM1=blah\n" .
       "NEWPARAM2=blah2\n" .
       "PARAM1=blah\n" .
       "PARAM2=blah2\n" .
       "PARAM3=blah3\n";

我尝试在 sed 替换子句中使用 '\n', \n 但没有运气。任何帮助将不胜感激

【问题讨论】:

  • 这是什么语言?这不是shbash
  • 抱歉,我在 bash 脚本中使用了这个
  • 是的,我得到的是 $str = "START\n" 。 “NEWPARAM1=废话”。 “NEWPARAM2=blah2”。等如果格式混乱,它所做的就是将 \\n 解释为另一个换行符,因此它在 blah 之后添加一个换行符,然后在 '.' 之后添加另一个换行符
  • 在 Perl 中完成所有事情不是更容易吗?

标签: regex bash replace sed newline


【解决方案1】:

像这样使用它:

str_new='"NEWPARAM1=blah\\n" .\n"NEWPARAM2=blah2\\n" .\n'
sed -i.bak "/START/{n;s/^/$str_new/;}" script.pl

cat script.pl
$str = "START\n" .
"NEWPARAM1=blah\n" .
"NEWPARAM2=blah2\n" .
"PARAM1=blah\n" .
"PARAM2=blah2\n" .
"PARAM3=blah3\n";

【讨论】:

  • 在 str_new 中使用 $、\1 -> \9 和 & 时要小心,因为在 s 的替换部分中使用了少数 RegEx vlaue//
  • 您能详细说明一下吗?我认为这对我来说不是问题,因为有一组预定义的数据将从中填充这些参数,因此我可以测试每个案例
【解决方案2】:

我会考虑在 perl 中使用 heredoc 来简化问题:

$str = <<EOT;
START
PARAM1=blah
PARAM2=blah2
PARAM3=blah3
EOT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2020-03-13
    • 2020-07-28
    • 1970-01-01
    相关资源
    最近更新 更多