2016-10-05 7 views
2

の終わりに、私は次の行では、次のテキストファイルがあります。のgrep、文字列一致した後、追加ではなく、ライン

<test="123"> 
<test="456"> 
<test="789"> 

を私の目的は、キーワードを付加することが上記のテキストファイルを持っていることです「HELLO」上記の数字の後に、次のように:

<test="123.HELLO"> 
    <test="456.HELLO"> 
    <test="789.HELLO"> 

をgrepコマンドとカットで、私は引用符の間の値を取得するために管理します。

grep -o "test=".* test.txt | cut -d \" -f2 

私が取得するために管理し、最も近いではなく、直接行の末尾に付加し、「.HELLO」ですが、私はこのライン

grep -o "test=".* test.txt | cut -d \" -f2 | sed -i -- 's/$/.HELLO/' test.txt 

と、その上にsedを使用しようとしました(とない引用符の間で数字の後に)

<test="123">.HELLO 
<test="456">.HELLO 
<test="789">.HELLO 

どのように要求されたラインを私に提供するために私のsed文を修正できますか?

+0

あなたは明確にすることができます:1)期待される出力ラインの前にスペースがあるため2のフォーマットの必要に応じて、または誤ってここに示されている)あなたの入力ファイルは、 'テストを='含まない行が含まれていますか?そうであれば、それらも出力の一部でなければならないでしょう – Sundeep

答えて

1

sedのグループで実行できます。新しい出力を作成するには、あなたがこれを行うことができます:

sed -i 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt 

説明:

  • ()がグループである

    sed 's/\(test="[^"]*\)"/\1.HELLO"/g' test.txt 
    

    がその場でそれを変更するには、-iスイッチを使用することができます。 \1で参照できます。 sedでは、括弧をエスケープする必要があります。\(\)

  • [^"]*は引用符ではないものすべてにマッチします。したがって、一致が見積もりの​​前に停止する
  • 置き換えの場合、見積もりはグループ外にあるため手動で追加する必要があります。だから、あなたは見積もりの​​前にものを置くことができます。
1

これはsedで直接実行できます。カットは必要ありません。

grep "test=" test.txt | sed 's/"\(.*\)"/"\1.HELLO"/' 
+1

grepも不要で、 '-o'オプションはこの場合には使用すべきではありません。grepコマンドにサンプルファイル名を追加することができます... – Sundeep

+1

私の答えを編集しました。OAが残しておきたい、ファイル内に余分な行がある場合に備えて、grepを残しました。もちろん、sedを使って直接行うこともできますが、これはもっと単純化しているようです。 –

+0

良い今:) 'sed -n '/ test =/s /" \(。* \) "/" \ 1.HELLO "/ p' test.txt'もシンプルですが、私はあなたのポイントを得る:) – Sundeep

1

はこれを試してみてください:

これはあなたのファイルはどのように見えるかです。

bash > cat a.txt 
<test="123"> 
<test="456"> 
<test="789"> 

あなたのテキストは、これはあなたのために働いていた場合、私に教えてください

bash > cat a.txt |sed 's/">/.HELLO">/g' 
<test="123.HELLO"> 
<test="456.HELLO"> 
<test="789.HELLO"> 
bash > 

をSEDにパイプ。

1
awk 'sub("[0-9]+","&.HELLO")' file 
関連する問題