文字列を文字列自体の一部に置き換える

文字列を文字列自体の一部に置き換える

テキストファイルに保存されているデータを整理しています。各行はカテゴリラベルで始まり、その後にクリーンアップしたい実際のデータが続きます。複数のサブフォルダには多くのテキストファイルがあるため、通常はegrepファイル名をsed

CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too

これで、Iで始まるすべての行で次の内容が(SEM|AFF|CON)置き換えられます。つまり、データは後で次のようになります。(T|t)he[ ]*(:|\,)

CON: Unix and Linux question
SEM: eins, zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too

これまで、私は2つのステップ、つまり:- 部分と,- 部分を通してこれを達成しようとしました。しかし、私は最初の足を踏み出しました。

最初の部分 ファイルを認識するコマンド/モードegrep -rl ^"(SEM|CON|AFF)\: (t|T)he"は期待どおりに機能します。

今私がするとき

egrep -rl ^"(SEM|CON|AFF)\: (t|T)he" | xargs sed -i 's/\((SEM|CON|AFF)\: \)(t|T)he[ ]*/\1/g'

何もしません。私のsed部分は間違っていますか?を逆((SEM|CON|AFF)\:参照できませんか\1

第二部 ファイルを認識するコマンド/モードはですegrep -rl ^"(SEM|CON|AFF)\:.*\,[ ]*(t|T)he"。これも期待どおりに機能します。しかし、sedこれまで試したすべての組み合わせはコンテンツを削除します。

答え1

私は以下を使用します:

sed -r '/(SEM|AFF|CON)/ s/([:,] *)[Tt]he */\1/g' file

-iファイルを所定の位置に変更するオプションが追加されました。

答え2

sed式を使用してください(GNU sedが必要です):

sed -r -i -e '/(SEM|AFF|CON)/s/([:,]\s*)the\s+/\1/ig' *

sed コマンドの先頭の検索パターンは、選択したカテゴリで始まる行に置換を制限します。i置換コマンド()のフラグは、パターン内の大文字とs//小文字を区別しないようにします。このgフラグは、1行で複数の置換を許可します。\sスペース(スペース、タブ)を表します。

sedフラグと一緒に拡張正規表現を使用してください-r。たとえば、GNU sedはこれをサポートします。この-iフラグを使用すると、内部編集が可能になります。シェルは*現在のディレクトリのすべてのファイルに展開されます。

このパターンは、その後に少なくとも1つのスペースまたはタブを含めることで、likeで始まる単語が置き換えられないようにしますthethetheater

答え3

次の方法を試してください。

egrep -rl "^(SEM|CON|AFF)\: (t|T)he" * | xargs sed -r -i 's/(^(SEM|CON|AFF):\s)((t|T)he[ ]*)/\1/g'

答え4

使用幸せ(以前のPerl_6)

~$ raku -pe 's/^ [SEM|AFF|CON] <+[:,]>  \s  <( [T|t] he \s+ //;'  file

入力例:

CON: the Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: The holy seat
TTITLE: As we go, the Kuckuck comes too

出力例:

CON: Unix and Linux question
SEM: eins, the zwei, drei
AUTH: , the
AFF: holy seat
TTITLE: As we go, the Kuckuck comes too

基本的にコードを理解して実装することで、この問題を簡単に解決できます。キャプチャマーク。 Rakuでは、キャプチャマーク記号が<(....)>両方のキャプチャタグを使用する必要はありません。

キャプチャタグの機能は何ですか?上記の代替演算子認識部分では、s///すべての要素が認識されます。

^ [SEM|AFF|CON] <+[:,]> \s <( [T|t] he \s+

ただし、キャプチャタグのため、右側のすべてのアイテムだけが<(「キャプチャされた」状態になります。つまり:

<( [T|t] he \s+

ここで、より大きなシーケンスを識別し、「キャプチャー」のサブシーケンスを維持したので、「キャプチャー」を空に置き換えて所望の結果を得る。注:上記のコードの最終正規表現原子では\s+ありません\s*。これは、The「相対性理論」のようなタイトルから除去されるのを防止する。

https://docs.raku.org/言語/regexes#Capture_markers:_%3C(_)%3E
https://docs.raku.org/言語/regexes
https://raku.org

関連情報