交換したい
# Bulk Delete #
と
=== Bulk Delete ===
次のsed
コマンドを使用しています。
sed "s/#\([^#]*\)#/===\1===/g" filename
それは機能しますが、置き換えもします
### Translation
と
======# Translation
それを防ぎ、Macとubuntuの両方で動作させるにはどうすればよいですか?
最も簡単な方法は、空白も一致させることです。
sed 's/# \([^#]*\) #/=== \1 ===/g' filename
もう 1 つの方法は、2 つのハッシュの間に複数 (1 つ以上) の非ハッシュを要求することです。
sed 's/#\([^#]\{1,\}\)#/===\1===/g' filename
は、その直前のパターンの\{n,m\}
少なくともn回の出現と最大m?
回の出現を必要とする量指定子の表記法であるため、 、*
およびメタ文字 (それぞれ、、および+
で表すことができます) の一般化です。mが欠落している場合、それはnより小さくない任意の数を意味します。nが欠落している場合、それは m よりも大きくない任意の数を意味するため、 0 と同等です。\{0,1\}
\{0,\}
\{1,\}
sed
+
別の書き方は次のとおりです。
sed 's/#\([^#][^#]*\)#/===\1===/g' filename
もちろん、アイデアを組み合わせることができます。
sed 's/# \([^#][^#]*\) #/=== \1 ===/g' filename
sed 's/# \([^#]\{1,\}\) #/=== \1 ===/g' filename
+
ではない少なくとも 1 つの文字を強制するために使用できます。#
OSXのはデフォルトのsed
ように強化された正規表現構文をサポートしていないため、フラグを sed+
に渡す必要があります。-E
良いニュースは、フラグがシステムでも-E
うまく機能することです。フラグ*nix
を使用する場合、、、などの特殊な正規表現文字のエスケープをスキップできます。-E
+
(
sed -E "s/#([^#]+)#/===\1===/g" filename