他の人が編集したファイルがあります。これには次の行が含まれています。
<E> This is text </E>
私はいくつかのBashシェルスクリプトを使用して、これらのテキスト行に対して一連のテキスト置換機能を実行します。ただし、テキストの置き換えが機能するには、フォーマットが完全に正確である必要があります。それはほとんど事実ですが、私がこのファイルを受け取るエディタがスペルエラーを犯さないとは確かに期待できません。
フォーマットの一部には前後に<E>
スペースがあります</E>
。それ以上も以下でもない。したがって、次は正しくありません。
<E>This is text </E>
<E> This is text</E>
<E> This is text </E>
<E> This is text </E>
私はsed
使用できることを知っています特定問題は前の2つのスペースと同じです(私が扱っているテキストにも文字が含まれているので代わりに</E>
使用されます)。#
/
/
sed -i '$ s# </E>#" </E>#g' *.txt
...しかし、未知の番号を検索するためにどのように使用するのかわかりません。また、空白がない場合は、隣接する文字<E>
または</E>
任意の文字がある可能性があります。
最も重要なのは、空白がなく、テキストとラベルを区切る2つ以上のスペースを持つインスタンスを検索して1つのスペースに変換するには<E>
どうすればよいですか?</E>
答え1
sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g'
(注:私は正規表現の区切り記号の!
代わりに#
またはを使用します。個人的な好みです。)/
sed
-e
各コマンドの前にこのフラグが付いている限り、複数のコマンドを渡すことで入力に対して実行できます。
上記の正規表現では、末尾の空白は*
「0個以上の空白文字と一致」を意味します。マニュアルre_format
ページでは、この種の複製に関する詳細情報を提供します。
後ろに「」が続く原子は、その
*
原子に一致する項目が0個以上含まれるシーケンスと一致します。後に「」が続く原子は、+
その原子が1回以上現れる順序と一致します。後ろに「」が続く原子は、その?
原子に対して0または1つの一致と一致します。
*
ここで「atom」は+
または前のサブパターンです?
。
あなたの例では、次のコマンドを実行してくださいsed
。
reedm@www:/tmp $ cat > example.txt
<E>This is text </E>
<E> This is text</E>
<E> This is text </E>
<E> This is text </E>
reedm@www:/tmp $ sed -e 's!<E> *!<E> !g' -e 's! *</E>! </E>!g' example.txt
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
<E> This is text </E>
答え2
「少なくとも一つの空白」は/ \+/
「0個以上の空白」は/ */
「空間ではない」は/[^ ]/
"two or more spaces" is either / */ or / \+/
答え3
echo $STRING | tr -s " "
複数の連続した空白文字を削除し、単一の空白に減らす必要があります。その後、1つのスペースをどのように処理するかを決定するのはユーザーの役割です。
答え4
処理された正規表現を表示しますsed(1)
。下にたくさん\+
前のタスクを1回以上繰り返すことを選択できます。したがって、sed -i -e 's; \+</E>;</E>;g' *.txt
削除されますどの前のスペースの数です</E>
。 GNU sed情報マニュアル(pinfo(1)
私が見つけた最高のリーダーですがYMMV)を見ると、マニュアルページは間違いなくありません。詳細ノードのリストから「正規表現」を選択します。