2

次のようなCSVの行があるとします。

|Foo|,,,,,,,,|Bar|,,,,,

|カプセル化機能はどこにあり、,区切り文字はどこにありますか(ご想像のとおり)。

ただし、これらの空のフィールドに入力する必要のあるコードがあり、代わりにこの行を次のようなものに変換するとします。

|Foo|,||,||,||,||,||,||,||,|Bar|,||,||,||,||,

(末尾のコンマは後で処理できます)このCSVでこのsedコマンドを使用して、目的の結果を取得しようとしました。

sed 's/,,/,||,/g'

ただし、正規表現パターン,,は幅がゼロではないため、1つのフィールドしか処理していなくても、ライン上をスキャンすると2つ移動します。結果は次のようになります。

|Foo|,||,,||,,||,,||,|Bar|,||,,||,,

問題は、これまでのところ置換を行うと、次のようになることです。

|Foo|,||,,,,,,,|Bar|,,,,,

の周りのコンマはすでに「処理」されており、最後のコンマを含まない、登録した最後のコンマ||の次のペアに移動します,||,

sedを使用してこの置換を行うにはどうすればよいですか?

4

3 に答える 3

1

より洗練された方法は、条件分岐を使用することです。

$ sed ':a;s/,,/,||,/;ta' <<< '|Foo|,,,,,,,,|Bar|,,,,,'
|Foo|,||,||,||,||,||,||,||,|Bar|,||,||,||,||,

からman sed:

tラベル

最後の入力行が読み取られてから、最後の t または T コマンドから as/// が正常に置換された場合は、label に分岐します。label が省略された場合、スクリプトの最後に分岐します。

于 2013-02-08T17:17:54.017 に答える
1

簡単な解決策は、置換を繰り返すことです。

sed 's/,,/,||,/g;s/,,/,||,/g'
于 2013-02-08T17:06:16.833 に答える
1

awk を使用すると、このようにすることができます

awk '{while(i<2){gsub(",,",",||,");i++}}1' temp.txt
于 2013-02-10T02:21:01.420 に答える