无法用另一个字符串shell替换文件中的字符串

问题描述 投票:2回答:2

我有一个包含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
linux shell unix
2个回答
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允许稍后使用()进行分组,而不进行屏蔽 “...“ : 命令。在qd让它们读取之前,双qoutes允许shell评估$ x表达式 / $ pattern /:查找此模式并仅在找到模式时执行操作 s / a / b /:用b替换表达式a /^(.*)$/:我们的a-expression ^线的开始 (。*):一个任意字符,并以任意计数,作为一组捕获,以供以后引用为\ 1,因为它是第一个组。 $:行尾 / \ 1 $ suffix /:我们的b表达式 \ 1:在(。*)模式之上匹配的内容 $ suffix:shell替换了什么
  • 文件名

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

例如,$可以由shell解释,但如果没有触及,则可以表示“行尾”或“最后一行”或“美元符号”。

'+'可以表示至少一个,'。'可以表示'任何字符',\用于在sed中屏蔽,以引入像\ 1的引用。这是一个弥撒,但非常有用的学习。

小心使用sed。

“34 | AVC-00123HHGF | 42”中的垂直条将由sed als替代解释,可以是4或A,也可以是F或4.这样就可以匹配:

“34 Vs-00123 ......”“3 AVS-00123 ......”“......隐藏”“...... Hg 42”

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

“34 \ | AVC-00123HHGF \ | 42”

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

“34.AVC-00123HHGF.42”将匹配,因此做出合理的偏执决定,并进行测试和控制。 :)


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
© www.soinside.com 2019 - 2024. All rights reserved.