検索してsedに置き換えます。元の行も保持します


3

私は持っています

param1='123'

をお願いします

param1='123'
param2=123 

123は私がこれを実行したいファイルの間で変わるでしょう。

私は使用してparam2を得ることができます sed -i "s/param1=\([0-9]\+\)/param2='\1'/g" '{}' \; しかし、それから私はparam1を失います。

私はまた使用して行param2を追加することができます sed -i "param1='\([0-9]\+\)';/a \param2=\1; しかし、パターンは認識されていないと私は終わる param2=1

これら2つのコマンドを組み合わせる方法、またはこれを機能させる別の方法はありますか?

どうもありがとう!

回答:


4

番号グループだけでなく、全体の一致もキャプチャしてから、両方を出力に指定することができます。

echo "param1='123'" | sed "s/\(param1='\([0-9]\+\)'\)/\1\nparam2=\2/g"

完璧です、ありがとう。マッチ全体を出力してから、で改行を追加していますか nparam2 そして2番目の試合を出力する?それともこれはどのように機能しますか?
user1792403

2
@ user1792403:はい、それで終わりです。その点に注意してください \1 に置き換えることができます & (マッチした文字列全体)と外側 \( そして \) 削除することができます。 ---また g 最後のフラグは、置換が望みどおりに1行に複数回一致した場合はおそらく機能しないため、不要です。 ---すべての実装がそうではないことをお願いします sed サポート \n 改行を挿入します。 GNU sedがそれをサポートしています。
pabouk

私が十分な評判ポイントを持っているとき、私はこのコメントを+1するようになります、情報をありがとう。
user1792403

4

いくつかのオプションがあります。

  1. Perl

    echo "param1='123'" | perl -lpe 'print; s/(.+=).(\d+)./$1$2/'
    
  2. awk

    echo "param1='123'" | awk -F"[ =']" '{print $0"\n"$1"="$3}'
    
  3. シェル

    echo "param1='123'" | while read l; do echo "$l"; echo "${l//\'/}"; done
    
  4. もっと簡単 sed

    echo "param1='123'" | sed "p;s/'//g"
    

いい答えだ! OP(sed)によって選択されたツールが最後のものとしてリストされているのはなぜだろうか。さらに、そのコマンドが最も単純で最も短いコマンドである場合…
Melebius

@Melebius私がこれを投稿した時点ですでに別のメンバーがいたので sed 答えて、私は他の選択をしました。また、 sed 最短であり、それはまたモットの不可解です。
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.