テキストファイルがあり、sedを使用して次の文字列( "s"を含む)を置き換えたいと思います。
" rel="lightbox[1846]" title="
そして
#
[
との間の数字は]
可変であり、変更されます。
"
代替品に含めたいです。
私はワイルドカードについて読んで、.
それが何らかの方法で役立つと思いました。 -*
私が慣れていたものとは異なります。
答え1
sed -E 's/" rel="lightbox\[[0-9]+\]" title="/#/g' filename
答え2
sed
実際には作業に適したツールであり、s
コマンド(最も一般的に使用されるコマンド)があります。
シェルのファイル名のワイルドカードなどのツールの正規表現は構文がgrep
異なりますsed
。バラより私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?違いの要約。
置き換えるテキストでは、[
正規表現の特殊文字はそれ自体を表します。特殊文字なので\[
(バックスラッシュを使用すると、特別な意味なしに次の文字に代わる)ように書く必要があります。
数値シーケンスは[0-9]*
:[0-9]
「すべての数字」を意味し、*
「前の文字または文字セットを0回以上繰り返す」を意味します。
したがって:
sed 's/" rel="lightbox\[[0-9]]" title="/#/' <old-file >new-file
一重引用符のため、シェルはその間のすべての内容を文字通りコマンドに渡しますsed
。
答え3
どうですか?
sed 's/^" rel=.*title="/#/g' filename
これは、質問に引用した.
とを利用して、*
可変文字列の真ん中の文字を一致させます。あなたが指定する望ましい結果を達成することがテストされ、知られています。
文字列の始まりと終わりで小さなテキストサンプルのみを使用しましたが、意図せず望ましくない文字列と一致する可能性がある場合は、より正確になります。
答え4
sed 's/" rel="lightbox[[0-9]+]" title="/#/g' ファイル名
ただし、Perlで使用するには、次のように使用する必要があります。
`sed's/" rel="lightbox\[[0-9]+\]" title="/#/g' ファイル名