无法用另一个字符串shell

时间:2018-02-27 16:26:36

标签: linux shell unix

我有一个包含2行的文件文件名:

2018-Feb-22 06:02:01.1234|AVC-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|
2018-Feb-22 07:02:01.1234|BCV-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|

我想连结字符串

"Warning: Time elapsed:,3444, is smaller than Name2:44222"

在与

相等的行的末尾
Var1="2018-Feb-22 06:02:01.1234|AVC-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|"

或具有以下模式 Var2="2018-Feb-22 06:02:01.1234|AVC-00123HHGF |"

然后文件名将包含

 2018-Feb-22 06:02:01.1234|AVC-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|"Warning: Time elapsed:,3444, is smaller than Name2:44222"
 2018-Feb-22 07:02:01.1234|BCV-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|

这就是我尝试过的:

Var3='2018-Feb-22 06:02:01.1234|AVC-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|"Warning: Time elapsed:,3444, is smaller than Name2:44222"'

sed -i 's/'"$Var1"'/'"$Var3"'/' filename

sed -i "s/$Var1/$Var3/" filename

Var4='"Warning: Time elapsed:,3444, is smaller than Name2:44222"'
sed -i "/$Var1/a $Var4" filename

但没有任何反应。甚至没有错误。 还有其他方法吗?我需要在文件名中保持相同的行顺序。

更新:我已经放弃了使用sed并尝试了一个不太理想的解决方案,但它确实有效。

我有2个文件: File_to_change File_with_lines_to_add

While read line; do
     Prkey=##calculate pk
     N=0
     While read linetoadd; do
          Prmkey=##calculate pk
          If [ "$Prkey" =="$Prmkey"  ]; then
                N=1
                echo "$line$linetoadd">>outfile
           Fi
     Done < File_with_lines_to_add
  If [ "$N" == "0" ]; then
      echo "$line">>outfile
  Fi
Done < File_to_change

2 个答案:

答案 0 :(得分:0)

试试这个:

sed -i '' '/2018-Feb-22 06:02:01.1234|AVC-00123HHGF|/s/$/\"Warning: Time elapsed:,3444, is smaller than Name2:44222\"/' gilename

如果这不起作用,退回到更简单的事情,告诉我们当您尝试这样做时会发生什么:

sed 's/2018/XXXX/' filename

答案 1 :(得分:0)

suffix="Warning: Time elapsed:,3444, is smaller than Name2:44222"
pattern="AVC-"
sed -E "/$pattern/s/^(.*)$/\1$suffix/" filename 

2018-Feb-22 06:02:01.1234|AVC-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|Warning: Time elapsed:,3444, is smaller than Name2:44222
2018-Feb-22 07:02:01.1234|BCV-00123HHGF|427654|Default|Name1 [1]|2334|2344444|(00:00:00.45567)|
  • sed -E:-E允许稍后使用()进行分组,无需屏蔽
    • &#34; ...&#34; : 命令。在qd让它们读取之前,双qoutes允许shell评估$ x表达式
      • / $ pattern /:查找此模式并仅在找到模式时执行
      • s / a / b /:用b替换表达式a
        • / ^(。*)$ /:我们的a-expression
        • ^行首
        • (。*):一个任意字符,以任意计数,作为一个组被捕获,以供日后引用\ 1,因为它是第一组。
        • $:行尾
        • / \ 1 $ suffix /:我们的b-expression
        • \ 1:匹配(。*)模式
        • 之上的内容
        • $ suffix:被shell取代的内容
  • filename

请注意,许多关键字(更好的关键字符,因为它们中的大多数只有1个字符长)通过上下文更改其含义,引用很重要,并且标记如-E,-i,-r。

例如,$可以由shell解释,但是如果没有触及,则可以表示&#39;行结束&#39;或者&#39;最后一行&#39;或者&#39;美元符号&#39;

&#39; +&#39;可以表示至少一个,&#39;。可以表示任何字符&#39;,\用于在sed中屏蔽,以引入像\ 1这样的引用。这是一个群众,但学习非常有用。

小心使用sed。

&#34; 34 | AVC-00123HHGF | 42&#34;将由sed als替代解释,4或A和F或4.所以这将匹配:

&#34; 34VC-00123 ...&#34; &#34; 3AVC-00123 ..&#34; &#34; ... HHGF2&#34; &#34; ... HHG42&#34;

这使得2x2替代品的4种组合,它们都不匹配&#34; 34 | AVC-00123HHGF | 42&#34;。怎么处理?好掩盖:

&#34; 34 \ | AVC-00123HHGF \ | 42&#34;

这可能会被其他sed程序再次完成,但你猜测它会导致什么。

&#34; 34.AVC-00123HHGF.42&#34;会匹配,所以做出合理的偏执决定,测试和控制。 :)