繁体   English   中英

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

[英]Delete the last occurence of a string in a file in unix/linux

需要将文件中的最后一个VirtualHost字符串移到eof处。 我尝试使用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> 

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

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

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

a追加到仅包含的行上.

? 向后搜索

d删除一行

wq写入文件并退出

您的命令有效:

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

然后你评论

我正在使用的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

这可能对您有用(GNU sed):

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

含盖克

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM