需要在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>
答案 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
我正在使用的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