最初のセミコロンの後のすべてのセミコロンを変更する方法は?

最初のセミコロンの後のすべてのセミコロンを変更する方法は?

この問題は、Excelファイルの質問と回答を、Anki Flashカードプログラムが説明したように処理する.txtファイルにインポートしようとすることに関連しています。ここ。複数のフィールドを持つことはできないため、オプションを1つのフィールドに設定する必要があります。

Ankiのマニュアルで説明されているように、LibreOfficeでCSV形式で保存されたデータ(フィールドセパレータとして使用されるセミコロン - マニュアルの内容とは異なります)

Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
...

すべてのオプションを含む各項目は、「フラッシュカード」という行にあります。カードでは、前半はセミコロンの前に、後半はセミコロンの後に続きます。改行などの2番目のフラッシュカード。

必要な出力はUTF-8でなければなりません。

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
...

私のPerl擬似コードは以下に基づいています。回答

perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file

コメントしました。

perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    s/;/\0/;    # turn the first semicolon into a null byte
    s/;/ |/g;     # replace all other semicolons with " |"
    s/\0/;/     # restore the first semicolon
' file

最初のセミコロンの後のすべてのセミコロンを変更する方法は?

答え1

GNUの使用sed:

sed 's/;/|/2g'

;|2回目の発生からグローバルに交換します。

sed 's/;/|/2sumはPOSIXですが、s/;/|/g設定はPOSIXではなく、動作は実装ごとに異なります。ただし、GNU実装を使用すると、sedこの動作が明確に文書化されます。

答え2

sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN

これが起こるので注意してくださいいいえほとんどの置換を処理するには正規表現を使用しますが、代わりにより基本的な(そしてより優れた性能) 翻訳するこれを行う関数 - POSIX移植可能な方法で実行します。これはsedPOSIXがインストールされているすべてのシステムで機能します。

セミコロンをパイプ;に、パイプを行列に同時に変換します。このパイプは、入力ラインに何かが発生した場合に備えてラインとして残ります。次に、パイプの最初の発生をセミコロンに変更し、すべての行をパイプに変換して単一の置換を強力​​に処理するために残りのすべてを復元します。||\n|\ns///|;\n|s///

コピー/貼り付けデモのためにここに文書を使用している間、<<\INおそらく<infile >outfile

出力:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

答え3

単にsed -e 's/;/|/g' -e 's/|/;/' data.csv次のことができます。

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

これはあなたが望むようです。

答え4

あなたは小さな間違いを犯しました:

~$ perl -00 -pe 's/;/\0/; s/;/\n/g; s/\0/;/' file
Question; option 1
 option 2
 option 3
 option 4
 ...
 option n

あなたは何をしましたか:

s/;//g;     # remove all other semicolons
s/\0/;/     # restore the first semicolon

あなたが欲しいと言ったこと:

s/;/\n/g;     # change all other semicolons
s/\0/;/     # restore the first semicolon

関連情報