1

これは期待どおりに機能します。

入力ファイル src.txt:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp

指図:

sed 's/-i .*\./XXX/' <src.txt

期待どおりの結果:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp

次に、これらが期待どおりに機能しないのはなぜですか。

指図:

sed 's/-i (.*)\./XXX/' <src.txt

期待される:

ffmpeg XXX3gp
ffmpeg XXX3gp
ffmpeg XXX3gp

実結果:

ffmpeg -i uno.3gp
ffmpeg -i dos.3gp
ffmpeg -i tres.3gp

指図:

sed 's/-i (.*)\.3gp/\1.mp3/' <src.txt

期待される:

ffmpeg uno.mp3
ffmpeg dos.mp3
ffmpeg tres.mp3

実結果

sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS

括弧はグループ化には機能していないようですが、私が見つけたすべてのチュートリアルと例は、それらが必要であると想定しているようです...

4

2 に答える 2

5

Classic sed(GNUsedである必要はありません) では、グループ化コマンドは、エスケープされていないのではなく、 \(and \)(およびカウントは\{andを使用) を使用します。\}

したがって、次のことを試してください。

sed 's/-i \(.*\)\./XXX/' <src.txt
sed 's/-i \(.*\)\.3gp/\1.mp3/' <src.txt

または、GNU を持っている場合は、 orをsed追加して「スクリプトで拡張正規表現を使用する」(から引用)。-r--regexp-extendedsed --help

sed -r 's/-i (.*)\./XXX/' <src.txt
sed -r 's/-i (.*)\.3gp/\1.mp3/' <src.txt
于 2012-08-11T01:29:16.177 に答える
2

Jonathan Leffler があなたのエラーの原因について答えたように、後方参照は必ずしも良いものではなく、スクリプトの速度が本当に遅くなることもあります。

さらに、あなたの場合、後方参照はまったく必要ありません:

sed 's/-i //;s/\.3gp/.mp3/' <src.txt 

仕事をします。

于 2012-08-11T06:33:10.477 に答える