0

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> 
4

5 に答える 5

1

edエディタは、このような状況で役立ちます。呼び出されるとファイルの最終行に配置されるため、目的の行を逆方向に検索して削除するだけです。同様に簡単に行を追加し直すこともできます (最初に追加するのが理にかなっています):

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

この-sオプションは、edの診断出力を抑制します。

aのみを含む行まで追加します.

?後方検索

d行を削除します

wqファイルを書き込んで終了する

于 2013-09-25T13:41:49.320 に答える
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>
于 2013-09-25T18:18:37.510 に答える
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
于 2013-09-25T13:50:54.120 に答える
0

ガウク付き

awk -v RS='/VirtualHost>\n' 'RT{printf prevRT; printf $0; prevRT=RT};
!RT{printf $0prevRT}' file
于 2013-09-26T03:39:23.290 に答える