次のようなテキストファイルがあります。
English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
English words only
Also English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
真ん中には2本の線がEnglish words only
ありAlso English words only
、次々と線が引かれていることに注意してください。
私がする必要があるのは、これらの2つの行を取得し/
、次のように、で区切られた1つの行に結合することです。
English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
English words only / Also English words only
English and 日本語
日本語のみ
English words only
English and 日本語
日本語のみ
次の正規表現を使用してASCII文字を含む行を検索したり[[:ascii:]]
、を使用して非ASCIIを検索したりできることがわかりました[^[:ascii:]]
。ただし、検索する必要があるのは非ASCII文字のない行であるため、正規表現を使用して条件に一致しないインスタンスを見つけるのに少し問題があります。
「逆マッチング」についてこの質問を見つけましたが、答えは私を超えています。
そして、もちろん、お互いの関係に基づいて線を一致させることは別の問題です。これらの行が次々にある場合、これらの行を一致させることはできますか?それが可能かどうかさえわかりません。
非ASCII文字を含まないすべての行を検索し、LibreOffice、Gedit、またはコマンドラインを使用してそれらを組み合わせる方法はありますか?
ファイルの長さは数千行であり、私にはわかりませんが、3つまたは4つのグループにある英語のみの行が発生する可能性があることに注意してください。
キャラクタークラスをsed
知らなくても、この仕事に使えるようです[[:ascii:]]
。その代わりに、またはロケールを使用する限り、エスケープシーケンスの 範囲ですべてのASCII文字を指定できます。[\d0-\d127]
C
POSIX
信頼できるはずのコマンドは次のとおりです。
LC_ALL=C sed -r ':a;N;s|^([\d0-\d127]+)\n([\d0-\d127]+)$|\1 / \2|;ta' file
LC_ALL=C
C
このコマンドにのみロケール設定を使用してください(そうしないとエラーが発生します)-r
拡張正規表現を使用して、コマンドを読みやすくします(必要なバックスラッシュを少なくします)(GNUsed
も-E
同じ意味で認識します)。:a
ラベル-ループはここから始まります;
シェルのようにコマンドを分離しますN
次の行をパターンスペースに読み込んで、置き換えることができます \n
s|old|new|
交換するold
とnew
^([\d0-\d127])\n([\d0-\d127]+)$
-ASCIIのみで2行を照合し、の最初の行\1
との2番目の行をキャプチャし\2
ます。^
ラインの開始され、\n
改行され、$
行の終わりであるので、^line 1\nline 2$
全体をテストline 1
してline 2
。\1 / \2
/
改行の代わりに区切られた1行目と2行目。ta
-最後の検索と置換コマンドが成功した場合は、ループを再実行してください。これにより、ファイルのすべての行を処理し、3つ以上のすべてのASCII行が一緒にあるインスタンスを処理できます。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加