1

私は、次の形式の区切られたデータセットを取得するプロジェクトに取り組んでいます。

field1~field2~field3~.....~fieldn

空のフィールドを持つ可能性があるため、

field1~~~field4~~field6

完全に受け入れられます。

このファイルは、社内の翻訳プログラムを使用して翻訳されますが、少し足りないところがあります。具体的には、空のフィールドをうまく処理できません。私の解決策は、スペースや @ 記号などのダミーの値をそこに貼り付けることでした。私はもう試した:

sed -r 's/~/~ ~/g'

awk '{gsub(/\~\~/,"~ ~")}; 1' file > file.SPACE

しかし、これらは両方とも MULTIPLE フィールドを置き換えるには不十分です。だから私が入力した場合

field1~field2~~~field3

それは出力します:

field1~field2~ ~~field3

トランスレータのコードを変更することはできないので、できればこれをスクリプト化したいと思います。区切りファイルを作成するプログラムのコードを変更することはできますが、変更したくありません。回避策はありますか、それとも正規言語に固有の制限の 1 つにすぎない表現を考え出していますか?

編集:迅速な対応に感謝します。すべてのソリューションが機能したので、すべてに賛成票を投じました。説明があるので、ジャニートを受け入れると思います。

また、なぜ反対票を投じるのですか?

4

4 に答える 4

4

あなたは試すことができます:

sed -e ':a;s/~~/~ ~/;ta'

これにより、ラベル「a」が「:」コマンドで作成され、発生したものの1つが。に置き換え~~られ~ ~、前の置換コマンドが成功した場合は、「t」テストコマンドを使用して「a」ラベルに戻ります。

これがお役に立てば幸いです=)

于 2012-10-04T18:02:15.803 に答える
3
awk '{for( i=0; i<=NF; i++ ) if( $i ~ /^$/ ) $i = " " } 1' FS='~' OFS='~' input

また:

awk '/^$/{ $0 = " " } 1' ORS='~' RS='~' input

また:

awk '{ while( gsub( "~~", "~ ~" )); }1' input
于 2012-10-04T18:03:10.090 に答える
1
sed -e ':loop' -e 's/~~/~ ~/g' -e 't loop' file
于 2012-10-04T18:03:44.980 に答える
1

パールを使用できます

perl -pe 's/~(?=~)/~ /g'

"~"...これは、それぞれの後に続く"~"と置き換えます"~ "


file.SPACE 使用する結果を保存するには

perl -pe 's/~(?=~)/~ /g' file >file.SPACE
于 2012-10-04T18:04:46.390 に答える