各行でn番目の一致が見つかったら、パターンを変更しますか? [コピー]

各行でn番目の一致が見つかったら、パターンを変更しますか? [コピー]

次の行を含むファイルがあります。

india;austria;japan;chile
china;US;nigeria;mexico;russia

各行のすべてのセミコロンをegに置き換えたいのですが、;NEW;2番目の項目から始めます。結果は次のようになります。

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

私はこれをgsubとして試しましたが、起こったすべてを置き換えました。 awk '/;/{gsub(/;/,";NEW;") }{print}'

答え1

このawk解決策は長いですが、一般化する方が簡単です。

awk -F\; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

sedコマンドを使用してループを実行し、t常に2番目(または必要なもの)区切り文字を一時トークン(通常\n)に置き換えることもできます。

sed ':b;s/;/\n/2;tb;s/\n/;NEW;/g' replacefile

答え2

GNU sedコマンドにはs///これを行うフラグがあります。

sed 's/;/;NEW;/2g' <<END
india;austria;japan;chile
china;US;nigeria;mexico;russia
END

出力

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

バラよりhttps://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-command

コマンドsの後には、次のフラグのうち0つ以上が続くことがあります。

g

最初の項目だけでなく、正規表現に一致するすべての項目に置換を適用します。

数字

交換のみ可能数字正規表現の最初の一致です。注:posix標準は、g混合時に何が起こるかを指定しません。数字修飾子は現在、sed実装間で広く合意された意味を持ちません。GNU sed の場合、相互作用は次のように定義されます。以前の一致を無視数字その後、すべての項目を一致させて置き換えます。数字昼間。

...

(強調は私のもの)

答え3

この作業は2段階で行います。

まず、すべてのセミコロンを次に置き換えます;NEW;

sed -e s/\;/\;NEW\;/g

;NEW;次に、最初のものをセミコロンに置き換えます。

sed -e s/\;NEW\;/\;/

パイプを使用して、1行で2つの代替を実行できます。例は次のとおりです。

$ more replacefile 
india;austria;japan;chile;
china;US;nigeria;mexico;russia
$ cat replacefile |sed -e s/\;/\;NEW\;/g  |sed -e s/\;NEW\;/\;/
india;austria;NEW;japan;NEW;chile;NEW;
china;US;NEW;nigeria;NEW;mexico;NEW;russia

答え4

より多くのコードで行うことができますが、ループはありません!

データ

china;US;nigeria;mexico;russia
iindia;austria;japan;chile

スクリプト

BEGIN{ FS=";" }{
    insert=$param
    ix=index($0, insert) + length(insert)

    if (NF <= $param) {
            rest = substr($0,ix,length($0))
            gsub(";",";NEW;",rest)
            line = substr($0,0,ix) rest

            gsub(";;",";",line)
            gsub(";$","",line)
            print line

} else {print}}

はい

 Microknoppix v # awk -f replaceNth.awk -v param=2 countries
 china;US;NEW;nigeria;NEW;mexico;NEW;russia
 iindia;austria;NEW;japan;NEW;chile

関連情報