Debian sed: 読めません

Debian sed: 読めません

require_oncePHPファイルから削除するコマンドを実行しようとしています。ここ(下のコード) しかし、エラーが発生します。

sed: 読み取れません。 -: 対応するファイルやディレクトリはありません。

正しいフォルダにあります。何が問題ですか?

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0 | \
  xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

修正する:

私が実行した場合:

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0

私は得る:

検索: 無効な述語 "-wholename"

私はこれを試み、すべてのファイルのリストを返しました。

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0

ただし、これを反映するように元のコンテンツを変更します。

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

エラーが発生します。

-bash: xargs: コマンドが見つかりません

ちなみに私はsedバージョン4.1.2を実行していて、コマンドラインで少し迷子になったので答えを説明してください。

答え1

エラーは、sedが読み取りを試みていることを示すようです。標準入力。試してみましたか?探すセクションからファイルが返されることを確認しますか?

答え2

2番目の呼び出しは意味がありません。 xarsgの前に「\」があるのはなぜですか? "xargs"というプログラムを呼び出そうとしていますが、bashがプログラムを見つけることができないと言うのは驚くべきことではありません(コロンの後の二重スペースに注意してください)。

xargsがゼロ個のファイルを返すとき(コマンドライン引数がないときにstdinから読み込みを試みるため)、sedがハングするエラー条件を削除するには、xargs引数に-rを追加する必要があります。

答え3

sedどのバージョンがありますか? POSIX sedは二重ダッシュオプションを理解しておらず、縮小しませんが、GNU sedは理解しています。

より移植性に優れた(私の考えにはより良い)ことを望んでくださいsed -i '/require_once/s![[:space:]]*!&// !'

答え4

残念ながら、質問にリンクされているページが消えて、元の命令を確認できません。代わりにいくつかの推測をしてみましょう。

最初のエラーは、GNUを実行し、sed.txtという名前の入力ファイルを内部で編集したときに発生します-。ファイルが存在せず、次のエラーが発生します。

はい(空のsedスクリプトを使用):

$ sed -i -e '' -
sed: can't read -: No such file or directory

ファイル名がどこから来たのかはわかりませんが、-ファイル名を取得できないことに関連している可能性がありますfind(下記参照)。

これで、コマンドはテストを認識しなくなり、find他のシステムまたは実装に切り替えたようです。このエラーは私を混乱させます。find-wholename

-wholename次に、に変更しますが、GNUと同じように-name変更する必要があります。-path-wholename-pathfind

に変更しても、find使用している式は正規表現である必要があるため、コマンドはまだ機能しません。-wholename-path

正規表現として*/Application.php正確な文字列と一致します*/Application.php*正規表現の先頭のAはリテラルと一致します*。を使用しようとした可能性がありますが、.*/Application.phpこれと同じです-name "Application.php"

上記のすべてを考慮してxargs呼び出しを削除します(それコマンド名の前のスペースをエスケープするとエラーが発生します。この空白は実際のコマンド名の一部であり、見つかりません。

find . -type f -name '*.php' \
    ! -path '.*/Loader/Autoloader.php' \
    ! -name 'Application.php' \
    -exec sed -i 's/require_once/\/\/ &/' {} +

また、GNU 呼び出しが少し減るので、sed拡張正規表現を使用する必要はありません。

関連:

関連情報