2017-03-21 2 views
1

私のスクリプトでは、マークダウンファイルを渡してsedを使用していますが、1つ以上の#を持たない行を見つけようとしています。 <p></p>タグ 1がREに定義されていません

私の推論で行:行の先頭に

^[^#]+、1以上#

.\+で始まらない行を見つけるには、1つの以上の文字(別名を含む行を検索します空白行でない)

次に、一致した行を<p>\1</p>に置き換えます。一致する行は\1です。

しかし、私は "1"をREに定義していません。私の推論は正しかったのですが、どうすればこのエラーを修正できますか?数字が続く

BODY=$(sed -E 's/^[^#]+.\+/<p>\1</p>/g' "$1") 
+0

「\ 1」は、カッコ内の最初の一致を示します(例: '(。)')。そのような表現はありません。 –

+0

あなたが全体のマッチを置き換えたい場合は、 '&' – Barmar

答えて

3

バックスラッシュは、正規表現のN番目のキャプチャグループの一致で置き換えられているが、あなたの正規表現にはキャプチャグループを持っていません。あなたが非空行を見つけるために.+を使用する必要はありません

BODY=$(sed -E 's%^[^#].*%<p>&</p>%' "$1") 

- それはその先頭に文字を持っているという事実:

あなたが&を使用し、マッチ全体を交換する場合一致しません#は空ではないことを意味します。 [^#]の後に+は必要ありません。最初の文字は#ではありません。正規表現が行全体と一致する場合は、g修飾語は必要ありません。これは、行ごとに複数の一致を置き換える場合にのみ必要です。

置換文字列に/が含まれているため、エスケープするか、区切り文字を別の文字に変更する必要があります。

+0

を使ってください。これを試しましたが、代わりのコマンドに 'bad flag 'があります。'>' – 14wml

+0

nvmはそれを見つけました。 '%^ [^#]。*%

%g '" $ 1 ")' – 14wml

+0

'g'修飾子は一行に一度しか一致できないので、必要ありません。 – Barmar

関連する問題