sed
私はルーマニア語のテキストや他の適切なUnixツールを使って特定のテキスト置換操作を自動化したいと思います。これは私の要件です。
- 文字のすべてのインスタンスを内部単語
â
に置き換えます。î
- 語根が「român」の単語(「Românească」、「româneşte」など)は、変更されていないままにしてください。
- 「sunt」という単語は「sînt」に置き換える必要があります。
たとえば、
入力する:
până
împământenit
român
Românească
sunt
cugetând
予想出力:
pînă
împămîntenit
român
Românească
sînt
cugetînd
複数のスクリプトを試しましたが、sed
どちらも同時にすべての要件を満たしていませんでした。誰でも私を案内できますか?どんな助けやアドバイスにも感謝します!
答え1
説明したように、
sed '/[rR]omân/!s/â/î/g;s/sunt/sînt/g'
次の作業が完了します。
s/â/î/g
ubstitureがs
すべて(g
部分的に)表示されるâ
かどうかî
- 「アドレス」
/[rR]omân/
が逆!
のため、このパターンを含む行では、次のコマンドは機能しません。 s/sunt/sînt/g
結局、成分の一部として単語を置き換えました。
注:あなたの例ではă
交換されます。これが必要な場合
sed '/[rR]omân/!s/[âă]/î/g;s/sunt/sînt/g'
答え2
使用幸せ(以前のPerl_6)
~$ raku -ne 'S:g/â/î/ andthen \
S:samecase:g/ (<[rR]>om) (î) (n) /$0â$2/ andthen \
S:g/sunt/sînt/ andthen .put;' file
入力例:
până
împământenit
român
Românească
sunt
cugetând
出力例:
pînă
împămîntenit
român
Românească
sînt
cugetînd
-ne
Rakuには自動印刷ではなくコマンドラインフラグがあります。入れ替わると、楽の「big-S」のS///
表記が使えます結果文字列を返す。
andthen
トピック変数()はコネクタの上に再ロードされるため、$_
各後続のS///
操作は以前に変更されたテキストに適用されます。最後の句はandthen .put
トピック変数($_
)を再ロードし、最後のテキスト(.put
yesの略語$_.put
)を印刷します。
特殊文字の切り取りや貼り付けの時間を節約するために、Unicode名を使用することをお勧めします。したがって、楽の最初のコレクションの置換は実際には次のように書くことができます。
S:g/\c[LATIN SMALL LETTER A WITH CIRCUMFLEX]/\c[LATIN SMALL LETTER I WITH CIRCUMFLEX]/