正規表現を使用して、シンボルに一致する文字列にのみ文字を置き換えます。

正規表現を使用して、シンボルに一致する文字列にのみ文字を置き換えます。

シンボルマッチングリストを検索して、CSVの2番目の列の文字列を置き換えたり変更したりする方法についてのアドバイスが必要です。

これは私のファイルです。csv

[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12.18.l,ch17,12.1
2,yo11`18.p,ch18,13.5
3,qk13_18.q,ch19,22.6
4,ls15-18.r,ch20,23.7
5,ew16'18.s,ch21,24.9

sed/awk の実行後に予想される結果は次のとおりです。

[Entry]
Date,20-02-2000
[Input]
SL,Name,Datasize,value
1,tg12_18_l,ch17,12.1
2,yo11_18_p,ch18,13.5
3,qk13_18_q,ch19,22.6
4,ls15-18_r,ch20,23.7
5,ew16_18_s,ch21,24.9

検索が一致すると、何も-_ません。クエリが一致する場合は、, < ` '下線記号を使用して置き換える必要があります_

いくつかの組み合わせを試しましたが、うまくいきawkません。

 awk -F, -v OFS=, 'sub(/\.\`\>\'/,"_",$2)+1' file.csv

どんなアイデアにも感謝します。

答え1

編集する: OPがデータを編集したので。awk代わりに今使用する方が良いですsed

awk 'BEGIN{FS=OFS=","}/^[0-9]+,/{gsub(/[\.<`\x27]/,"_",$2);print;next}1' file.csv

答え2

そしてperl

perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e' -- "$file"

( ) 以外の 1 つ以上の ( ) 文字と 1 つ以上の ( ) 10 進数と行の始まり ( ) の後の 1 つ (+一致開始リセット) が ( ) 以外の文字に置き換えられる場合、同じ ( ) ord 文字 (数字または下線) または置き換えられます。,[^,]^+\d\d,\K$&\w-_

したがって、実際には、最初のフィールドがすべて10進数で構成されている場合は、alnum以外の文字_と2番目のフィールドの文字を置き換えます。-

ファイル内の特定のテーブルの一致を制限するには、次のようにします。

perl -pi -e 's{^\d+,\K[^,]+}{$& =~ s/[^\w-]/_/gr}e if
               /^SL,Name/ .. /^\[/' -- "$file"

で始まる行SL,Nameから始まる次の行の間でのみこれらの置換を実行します[

ファイルの内部編集を使用して、ファイル内の各行の式を評価するパターンを適用します(行は保存され、デフォルト変数は次の-iようになります)。-psed-e$_s/pattern/replacement/flagsパターン空間存在するsed)。

関連情報