![各行でn番目の一致が見つかったら、パターンを変更しますか? [コピー]](https://linux33.com/image/30050/%E5%90%84%E8%A1%8C%E3%81%A7n%E7%95%AA%E7%9B%AE%E3%81%AE%E4%B8%80%E8%87%B4%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%89%E3%80%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
次の行を含むファイルがあります。
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