[英]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.