
入力する:
$ 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