2013-03-03 5 views
8

sedを使って式を置き換えようとしています。正規表現はvimでは動作しますが、sedでは動作しません。私はスラッシュで番号の前に、最後のダッシュを交換していますので、sedの逆参照が間違った値を返す

/www/file-name-1 

/www/file-name/1 

を返す必要があります私は、次のコマンドを使用していますが、それは代わりに

/www /のファイル名/ 0を出力し続けます
sed 's/-[0-9]/\/\0/g' input.txt 

私は間違っていますか?これは、OS Xの下でsedのようだ

答えて

15

後でそれを参照するために、データを括弧の間にあなたが囲む必要がありますの\1を試してみて開始し、sedは、すべての文字を回復するには1でカウントを開始しますかっこの必要なしにマッチした場合は、&シンボルが使用されます。

sed 's/-\([0-9]\)/\/\1/g' input.txt 

もたらすこと:

/www/file-name/1 
+0

これは正解です。私は@ user2052491がかっこを使用していなかったことに気付かなかった。 – maljub01

+0

中括弧の前のバックスラッシュは必要ありませんか? – Blauhirn

0

は1でカウント後方参照ではなく\0

+0

私が\ 1を使用している場合、 "1はREに定義されていません" – user2052491

+0

OS X/macOSには古代のUNIXツールがあります。 '-r'を使うことはできません。つまり、括弧をエスケープする必要があります。 –

+0

OS Xのsedは拡張正規表現を有効にするために-rの代わりに-Eを使用します – thenickdude

5

は、あなたが(\1を開始)参照をバックアップすることができます前に、括弧を使用してキャプチャする必要があります。 sed -r 's|(.*)-|\1/|'をお試しください:

$ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
/www/file-name/1 

あなたはそう/は、置換が/が含まれている最良の選択ではありませんsedで任意の区切り文字を使用することができます。 -rオプションは拡張正規表現用ですので、かっこをエスケープする必要はありません。

関連する問題