交換したい
# 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