2つの文字列間の文字列を削除するには?

2つの文字列間の文字列を削除するには?

入力する:

$ cat a.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR

出力:

$ sed 's/SOMEMAGIC//g' a.txt
FOOBAR

私の質問:その恐ろしい「<tdalign...」部分をどのように削除できますか?これが私を狂わせている!

答え1

まあ、確かに簡単です。

sed -i 's/<.*>//' file

ここではあまり説明しません。

  • これが<私たちが一致させようとしている部分の始まりです
  • .*ランダムな文字(.)とランダムな数字(*)を表します。これは蚊を殺す大砲ですが、ビジョンではない例でも機能するはずです。
  • >競争が終わりました。

リアルタイム放送は次のとおりです。

➜  ~  cat test 
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
➜  ~  sed 's/<.*>//' test
FOOBAR

答え2

これを使用することもできます。

sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file

説明する:

^\([^<]*\)<-<開始位置からゼロ以外の文字またはそれ以上の文字を抽出し、最後に<抽出された文字をグループに保存します。

.*> - 見つかるまで文字を0回以上一致させます>

\(.*\)$- sedが文字を見つけたら、>最後の文字までのすべての文字を別のグループに保存し始めます(>>との間に文字を保存します。$)。

最後に、逆参照としてsed保存されたグループ(、)のみを印刷します\1\2

例:

$ cat file.txt
FOO<td align="right" style='mso-number-format:"\[$-409\]m\/d\/yy\\ h\:mm\\ AM\/PM\;\@";' x:str>BAR
$ sed 's/^\([^<]*\)<.*>\(.*\)$/\1\2/g' file.txt
FOOBAR

答え3

一方perl通行:

$ perl -F'<.*>' -anle 'print @F' file
FOOBAR

<.*>ここでは、行を削除するのではなく、正規表現を区切り文字として使用して行を分割します。

答え4

 sed -i 's/\(A\) B \(C\)/\1\2' /path/to/example.file

これにより、文字列AとCは変更されずに残り、文字列Bが切り捨てられます。文字を目的の文字列/正規表現に置き換えます。

はい

$ echo A B C | sed 's/\(A\) B \(C\)/\1\2'
$ AC

関連情報