2

私は、とりわけファイルから行を削除するスクリプトに取り組んでいます。削除する行は変数に格納され、コマンドライン引数から作成されます。これが私がこれまでに持っているものです:

#!/bin/sh
repo=$1
devscript=/usr/local/bin/svn-post-commit-update-$repo-dev
livescript=/usr/local/bin/svn-post-commit-update-$repo-live
sudoer="www-data    ALL=(root) NOPASSWD: $devscript, $livescript"
sed -i '//$sudoer/ d' /home/bdugan/t.txt

そして、次のエラーが発生します。

sed:-e式#1、char 3:不明なコマンド: `$ '

この時点で、私が台無しにしたいくつかの単純な構文の問題があることに気づきましたが、私の人生の間、それを見つけることができません。何か案は?

4

3 に答える 3

4

重要な点は、変数が展開されるように二重引用符を使用する必要があるということです。それ以外の場合sedは、文字通りドル記号が表示されます。

また、パターンにスラッシュが含まれていることも重要です。別の区切り文字を使用する必要があります。

sed -i "\|$sudoer|d" /home/bdugan/t.txt

文字列に表示される可能性が低い区切り文字を選択してください。

于 2012-05-15T14:01:06.703 に答える
2

行に文字が含まれているため、sed/の区切り文字が台無しになります。/regex/正規表現の代わりにawkを使用し、文字列の等式を使用することをお勧めします。

awk -v line="$sudoer" '$0 == line {next} {print}' ~/t.txt > ~/t.txt.new &&
mv ~/t.txt ~/t.txt.old &&
mv ~/t.txt.new ~/t.txt
于 2012-05-15T13:35:53.303 に答える
1

これを試して

sed -e "'s@${sudoer}@@'" -e '/^$/d' -i /home/bdugan/t.txt

これは区切り文字として使用@されますが、これは置換コマンドでのみ可能であり、その後空の行を削除します。

編集:正規表現/を壊す可能性があるため、ファイル名とパスの区切り文字として使用しないでくださいsed

アップデート:

使用している場合GNU sedは、コマンドを次のように減らすことができます

sed -e "'\@${sudoer}@d'" -i /home/bdugan/t.txt
于 2012-05-15T13:38:51.360 に答える