删除unix / linux中文件中最后一次出现的字符串

时间:2013-09-25 13:34:09

标签: linux bash shell unix sed

需要在eof中移动文件中的最后一个VirtualHost字符串。我尝试使用sed

#!/bin/bash
tac infile.txt | sed "s/<\/VirtualHost>//; ta ; b ; :a ; N ; ba" | tac
echo "</VirtualHost>" >>infile.txt

当前文字:

</VirtualHost>
#Added for Patch 
<LocationMatch ^/bea_wls_internal/>
RewriteEngine ON
</VirtualHost>
RewriteOptions inherit
</LocationMatch>

所需文字:

</VirtualHost>
#Added for Patch 
<LocationMatch ^/bea_wls_internal/>
RewriteEngine ON
RewriteOptions inherit
</LocationMatch>
</VirtualHost> 

5 个答案:

答案 0 :(得分:1)

ed编辑器在这些情况下派上用场。它在调用时将自身定位在文件的最后一行,因此您需要做的就是向后搜索所需的行并将其删除。您也可以轻松添加该行(首先执行此操作):

echo 'a
</VirutalHost>
.
?</VirtualHost>?
d
wq' | ed -s infile.txt

-s选项会阻止ed的诊断输出。

a 追加仅包含.

的行

? 向后搜索

d 删除一行

wq 写入文件并退出

答案 1 :(得分:0)

您的命令有效:

#!/bin/bash
tac infile.txt | sed "s/<\/VirtualHost>//; ta ; b ; :a ; N ; ba" | tac
echo "</VirtualHost>" >>infile.txt

you comment

  

我正在使用的tac语句能够打印所需的输出   在控制台上正确,但如何在文件中进行这些更改?

为此,请注意我添加的更改。它们包括将结果保存到临时文件new_file中,然后将其移至infile.txt

#!/bin/bash
tac infile.txt | sed "s/<\/VirtualHost>//; ta ; b ; :a ; N ; ba" | tac > new_file
echo "</VirtualHost>" >> new_file
mv new_file infile.txt

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r '\|^</VirtualHost>|{x;/./p;d};x;/./!{x;b};x;H;$!d;x;s/^([^\n]*)\n(.*)/\2\n\1/' file

答案 3 :(得分:0)

$ awk -v str="</VirtualHost>" 'NR==FNR {if (index($0,str)) skip=FNR; next} FNR!=skip; END{print str}' file file
</VirtualHost>
#Added for Patch 
<LocationMatch ^/bea_wls_internal/>
RewriteEngine ON
RewriteOptions inherit
</LocationMatch>
</VirtualHost>

答案 4 :(得分:0)

gawk

awk -v RS='/VirtualHost>\n' 'RT{printf prevRT; printf $0; prevRT=RT};
!RT{printf $0prevRT}' file