0

行全体を置き換えるのではなく、行自体を編集する差分パッチファイルを作成することはできますか?

たとえば、次の行があります。

 <foo:ListeningPortBar>3423</foo:ListeningPortBar>

これを次のように変更します。

 <cat:LoremIpsum>3423</cat:LoremIpsum>

つまり、実際のポート番号の周りのテキストを変更したいが、ポート番号は保持したい - すべて異なるポート番号を持つ多数のファイルにこのパッチを適用する必要がある - どのポートも保持してタグを変更したいだけだ番号は現在そこにあります。

どうすればこれを達成できますか?

ありがとう、ビクター

4

1 に答える 1

0

パッチが行全体を置き換えるのか、行の文字だけを置き換えるのかは実際には問題ではありませんが(最終結果は同じです、違います...?)、これは「パッチ」の質問ではないと思います。「sed」を使用したより簡単な解決策については、以下を参照してください。

たとえば、次のように想定します。

$ cat f1.txt
<xml>
<foo:ListeningPortBar>3423</foo:ListeningPortBar>
</xml>

$cat f2.txt
<xml>
<cat:LoremIpsum>3423</cat:LoremIpsum>
</xml>

次に、文字通りパッチは次のようになります。

$ diff -u f1.txt f2.txt
--- f1.txt  2012-07-08 03:14:39.328328048 -0700
+++ f2.txt  2012-07-08 03:14:30.618177130 -0700
@@ -1,3 +1,3 @@
 <xml>
-<foo:ListeningPortBar>3423</foo:ListeningPortBar>
+<cat:LoremIpsum>3423</cat:LoremIpsum>
 </xml>

このパッチファイルは、テンプレートとして使用したり、更新する必要のあるすべてのファイルの正しい値で変更したり、すべてのファイルに個別に適用したりできます。それは必要以上の仕事のように聞こえます。

一方、「sed」を使用するだけです。

$ sed 's/<foo:ListeningPortBar>\([0-9]*\)<\/foo:ListeningPortBar>/<cat:LoremIpsum>\1<\/cat:LoremIpsum>/' f1.txt  
<xml>
<cat:LoremIpsum>3423</cat:LoremIpsum>
</xml>

XMLを使用しているので、xsltprocを使用することも別の方法ですが、この単純な検索と置換のタスクではおそらくやり過ぎでしょう。

これをスクリプトで使用するには、次のようにします( "etc / etc"を上記のsedに置き換えます)。

for f in $(find dir -name "*.xml" -exec egrep 'foo:ListeningPortBar' {} \; -print)
do
  sed -i.bak 's/etc/etc/g' $f
done

...次に、「。bak」ファイルが実際に変更されたファイルと異なることを確認します。

于 2012-07-08T10:30:58.600 に答える