非常に長い中国語文字列がありますが、この質問のために次のようにします。
啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板
そして
阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔
最初の文字列には、すべての「簡単な」中国語文字が一覧表示されます。 2番目の文字列には「yi」と「中」の漢字の両方が表示されますが、「中」の漢字のみが必要です。 2番目の文字列から「yi」文字を削除したいと思います。
たとえば、編集後の2番目の文字列には「ah」または「love」は含まれません(おそらくより多くの削除項目を含む)。どちらも最初の文字列に表示されるためです。
質問:文字列Aに漢字が表示されたときに順序を維持しながら、文字列Bから漢字を削除する方法は?
私はこれがawk
またはsed
他のものとして解決できると思います。この文字列を2つのテキストファイルに変換し、2つのコマンドのいずれかを使用できるようです。別のファイルAからファイルBの行を削除する方法は? しかし、私はセカンダリファイルを作成せずにこれを実行したいと思います。
文字列の文字の順序を維持することも重要です。
答え1
構文(ksh、bash、zsh)を受け入れるシェルでは、${parameter/pattern/string}
次のことができます。
$ easy='啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板'
$ intermediate='阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔'
$ echo "${intermediate//[$easy]/}"
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
これは正規表現に似た文字選択に基づいています[…]
。存在するすべての単一文字
は削除されます。intermediate
easy
シェルに依存しない対応は次のとおりです。
$ echo "$intermediate" | sed 's/['"$easy"']//g'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
答え2
Rakuを使う(古いPerl6)
Rakuは、Unicodeをエレガントに扱うように設計されています。以下の各ペアの最初の例は、一般的にRakuドキュメントから取得されます。各ペアの2番目の例は、特定の中国語文字列を解くために適用されます。
$ echo "a123b123c" | raku -pe 'tr:d/123//;'
abc
$ echo "阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔" | raku -pe 'tr:d/啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板//;'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
または
$ echo "a123b123c" | raku -pe '.=trans("123" => "");'
abc
$ echo "阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔" | raku -pe '.=trans("啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" => "");'
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
コマンド-pe
ラインフラグは Raku が 1 行ずつ入力を受け取り、自動的に戻り値を出力するように指示します。tr///
演算子とルーチンの間には微妙な違いがありますtrans()
。以下の文書、HTH。
https://docs.raku.org/言語/operators#tr///_in-place_transliteration
https://docs.raku.org/routine/trans
https://raku.org/
答え3
私はそれを考えた!最善の解決策ではないかもしれませんが、次のように動作します。
echo 阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔 | sed -e "s/.\{1\}/&\n/g" | awk -v pat="啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" 'pat ~ $0' | tr -d '\n'
説明する:
echo 阿姨啊挨打矮小爱国护安检慰置岸边上按摩时案子暗示巴士拔
2番目の文字列を入力にパイプする方法。sed -e "s/.\{1\}/&\n/g"
各文字の後に改行を追加awk -v pat="啊爱好情人心安静排全装按照八把握爸吧白菜酒色夭百班长板" 'pat !~ $0'
pat
(最初の文字列)にない文字のみを印刷します。tr -d '\n'
すべての改行を削除
それは出力を提供します
阿姨挨打矮小国护检慰置岸边上摩时案子暗示巴士拔
そして、「Ah」、「Love」、「Ann」、「Press」の文字を削除してください。