2

交換したい

# Bulk Delete #

=== Bulk Delete ===

次のsedコマンドを使用しています。

sed "s/#\([^#]*\)#/===\1===/g" filename

それは機能しますが、置き換えもします

### Translation

======# Translation

それを防ぎ、Macとubuntuの両方で動作させるにはどうすればよいですか?

4

2 に答える 2

3

最も簡単な方法は、空白も一致させることです。

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
于 2013-03-08T06:17:15.930 に答える
1

+ではない少なくとも 1 つの文字を強制するために使用できます。#

OSXのはデフォルトのsedように強化された正規表現構文をサポートしていないため、フラグを sed+に渡す必要があります。-E良いニュースは、フラグがシステムでも-Eうまく機能することです。フラグ*nixを使用する場合、、、などの特殊な正規表現文字のエスケープをスキップできます。-E+(

sed -E "s/#([^#]+)#/===\1===/g" filename
于 2013-03-08T06:20:19.543 に答える