テキストファイルに保存されているデータを整理しています。各行はカテゴリラベルで始まり、その後にクリーンアップしたい実際のデータが続きます。複数のサブフォルダには多くのテキストファイルがあるため、通常は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で始まる単語が置き換えられないようにしますthe
。the
theater
答え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