2017-02-24 8 views
1

次の問題があります。sed特定の発生回数だけ見つけて置き換えます

私はシーケンスを持つファイルを持っています。特定のパターンを見つけて、別のパターンで置き換えたいのですが、特定の回数のみを置きたいのです。

例:

ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 

私は "defghi内" を見つけるだけで3回 "ABCDEF" とそれを交換したいです。

sed -i 's/DEFGHI/ABCDEF/g' /home/user/test.txt 

グローバルに置き換えたくありません。代わりに私は3回だけ交換したいと思います。

+0

?希望の出力を表示します。 – toolic

+0

申し訳ありません。私は別のpattenと交換したい。例:DEFGHI with ABCDEF – manoj

+0

これは自明ではありません。パターンが1行に2回以上出現することはありますか? – melpomene

答えて

0

あなたが最初の発生を置き換えることができますが3回を見つけました:

sed -i '0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/' file 

出力:これは、与えられたパターンを3回置き換え

ABCABCDEFJKLMN 
ABCABCDEFJKLMN 
ABCABCDEFJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
ABCDEFGHIJKLMN 
2

、彼らはライン上に分散している方の道

perl -0777 -pe'$i += s/DEF/xxx/ while $i < 3' <data.txt> out.txt 

パターンは行間で折れないことを前提としています。毎回先頭から検索し、文字列を渡します。これは以下に説明されている注意書きが付いていて、非現実的ですがシンプルです。

周囲のテキストと組み合わされたときに置換え自体がパターンを再作成する場合は、次のパスで置換されます。そのような置換は、パターンそのものの一部を特定の方法で含める必要があります。それでも問題があれば教えてください。

重複している可能性のあるパターンの処理は、この問題では指定されていません。この解決策があれば、最初のパスに置き換えられ、次のパスで重複するパスはなくなります。

+0

コメントは参考になりました、@sidyllによっておかげ – zdim

+0

(削除)答えは正しい考えを持って親切でした、ありがとう – zdim

+0

感謝。それは意図したように働いた..ありがとうalot – manoj

2

このbashを使用して行うことができ、GNUこのようsedは:

sed -z -i "$(echo s/DEFGHI/ABCDEF/{3..1}\;)" yourfile 
  • s部分に{3..1}結果は、各sコマンドは、第三の置き換え1にフラグ3で三回繰り返し2回目と1回目の出現。逆の順序が必要であるため、カウントと置き換えが混在することはありません。
  • -z takeはすべての入力行を一度に処理するため、行単位でなくファイル単位でカウントされます。あなたの参考のために

、ここではエコーの周りにコマンド置換を生成するものである:あなたが自分自身で `DEFGHI`を交換したいのはなぜ

echo s/DEFGHI/ABCDEF/{3..1}\; 
> s/DEFGHI/ABCDEF/3; s/DEFGHI/ABCDEF/2; s/DEFGHI/ABCDEF/1; 
+1

@SLePortそうです。私はシーケンスを反転させた。ありがとう。 –

+0

+1は3以外の任意の値でうまく動作するsed + shellコンボ用です。この「ブレース拡張」は、明らかに... bashですか? GNU sed + bashとbashlikeシェルです。 – stevesliva

関連する問題