无法用另一个字符串shell替换文件中的字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法用另一个字符串shell替换文件中的字符串相关的知识,希望对你有一定的参考价值。
我有一个包含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
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”将匹配,因此做出合理的偏执决定,并进行测试和控制。 :)
试试这个:
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
以上是关于无法用另一个字符串shell替换文件中的字符串的主要内容,如果未能解决你的问题,请参考以下文章