findの-execオプションでsed代替コマンドを使用すると問題が発生しました。

findの-execオプションでsed代替コマンドを使用すると問題が発生しました。

1を入力してください:

find . -maxdepth 1 -name "* *" -exec bash -c 'sed -n '1p' <(echo $1)' h {} \;

出力1:

./file with space

2を入力してください:

find . -maxdepth 1 -name "* *" -exec bash -c 'sed "1s_ _._" <(echo $1)' h {} \;

出力2:

./file.with.space

3を入力してください:

find . -maxdepth 1 -name "* *" -exec bash -c 'sed '1s_ _o_' <(echo $1)' h {} \;

出力3:

sed: -e expression #1, char 3: unterminated `s' command

出力3が間違っているのはなぜですか?この場合、一重引用符と二重引用符の違いは何ですか?

ベストアンサー1

シェルの解析後、3番目のコマンドは、、、、、、、、、、、、、、、、、、、、、でfind構成されます。次の引数と同様に、スペースは単一引用符リテラル内にあるため、単語は単一の引数です。したがって、到着するとパラメータ、、、、で実行されます。シェルスクリプトはパラメータ付きのコマンドであり、これは正しい形式のsedスクリプトではありません。.-maxdepth1-name* *-execbash-csed 1s__o_ <(echo $1)h{};sed 1s_find./file with spacebash-csed 1s__o_ <(echo $1)h./file with spacesed 1s_sed1s_

一重引用符で囲まれた文字列の中に一重引用符で囲まれた文字列を入れようとしますが、これは不可能です。 2 番目の一重引用符が一重引用符で囲まれた文字列を終了します。'\''リテラルを一重引用符で終わり、リテラルを一重引用符で囲み、リテラルを二重引用符で始めることができます。

find . -maxdepth 1 -name "* *" -exec bash -c 'sed '\''1s_ _o_'\'' <(echo $1)' h {} \;

もちろん、<(echo $1)単一のスペースではなく、ワイルドカードまたは一連のスペースを含むファイル名は破損します。代わりに、なぜこのような記事を書いたのかわかりません<<<"$1"

おすすめ記事