1

のパスを置き換えたい

(setq myFile "/some/path")

ファイルで。私はsedでそれをやろうとしました:

find ./_build/html -type f -name '*.html' | while read myFile; do
    MyFile=`readlink -f "$myFile"`
    sed -i "s/setq myFile [)]*/setq myFile \"$MyFile\"/" sphinx_nowrap.el
    # and then some actions on file
done

そしてperlで:

find ./_build/html -type f -name '*.html' | while read myFile; do
    MyFile=`readlink -f "$myFile"`
    perl -ne "s/setq myFile .+/setq myFile \"$MyFile\")/" sphinx_nowrap.el
    # and then some actions on file
done

しかし、どちらもエラーになります。

私はこれとこれとこれを読みましたがうまくいきませ

編集

これはperlエラーです:

Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "s/setq myFile .+/setq myFile "/home"
String found where operator expected at -e line 1, at end of line
        (Missing semicolon on previous line?)
syntax error at -e line 1, near "s/setq myFile .+/setq myFile "/home"
Can't find string terminator '"' anywhere before EOF at -e line 1.

ここにsedエラーがあります:

sed: -e expression #1, char 34: unknown option to `s'

編集2

したがって、解決策は区切り文字を変更することです。また、sed 式も変更する必要があります。

sed -i "s!setq myFile .*!setq myFile \"$MyFile\")!" sphinx_nowrap.el
4

2 に答える 2

4

perl (および sed) は、ファイル パスのスラッシュを正規表現の区切り記号として認識しているようです。別の区切り文字を使用できます。

find ./_build/html -type f -name '*.html' | while read myFile; do
    MyFile=`readlink -f "$myFile"`
    perl -ne "s!setq myFile .+!setq myFile \"$MyFile\")!" sphinx_nowrap.el
    # and then some actions on file
done

またはsedの場合:

find ./_build/html -type f -name '*.html' | while read myFile; do
    MyFile=`readlink -f "$myFile"`
    sed -i "s!setq myFile [)]*!setq myFile \"$MyFile\"!" sphinx_nowrap.el
    # and then some actions on file
done
于 2012-08-27T12:08:15.550 に答える
2

$MyPathあなたのホールドを仮定しましょう/foo/bar/baz。次に、Perlコードは次のようになります。

perl -ne "s/setq myFile .+/setq myFile \"/foo/bar/baz\")/" sphinx_nowrap.el

正規表現は3番目の/文字で終了します。これを回避するには、次のような別の区切り文字を使用できますs{}{}

perl -ine "s{setq myFile .+}{setq myFile \"/foo/bar/baz\")}; print" sphinx_nowrap.el

-iまた、オプション(インプレース編集)とステートメントを追加して、print実際に何かが印刷されるようにしました。

$MyPathしかし、おそらくコマンドライン引数として値aofを渡す方がよりエレガントでしょう。

perl -ne 's{setq myFile .+}{setq myFile "$ARGV[0]")}; print' $MyPath <sphinx_nowrap.el >sphinx_nowrap.el
于 2012-08-27T12:12:56.560 に答える