次の行を含むファイルがあります。
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