シンボルマッチングリストを検索して、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
ようになります)。-p
sed
-e
$_
s/pattern/replacement/flags
パターン空間存在するsed
)。