3

これを解決しようとして1時間後に破産を宣言します。質問は次のとおりです。

15,000 個のファイル (Magento) を含むフォルダーがあります。すべての著作権の日付を 2013 年から 2012 年に変更して、リリース間の正当な差分を取得できるようにしたいと考えています。この例に基づいて、sed を使用しようとしています: https://stackoverflow.com/a/1583282

このコマンドは機能しています:

cd path/to/project
find . -type f -print0 | xargs -0 sed -i '' 's/2013/2012/g'

ただし、2013年が日付にのみ適用されるとは明らかに信じられません。Magento の DocBlocks の完全な文字列は次のとおりです。

* @copyright   Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)

「(c) 2013 Magento」を文字列として使用するように sed 式を書き直そうとしていますが、エラーが発生します。

sed: RE error: illegal byte sequence

明らかに、何かをエスケープする必要がありますが、適用可能な例が見つかりません。私は決して bash ウィザードではありません。

式のこの部分の正しい形式は何ですか?

's/(c) 2013 Magento/(c) 2012 Magento/g'
4

4 に答える 4

3

明らかに、何かをエスケープする必要がありますが、適用可能な例が見つかりません。私は決してバッシュウィザードではありません

あなたがどんな種類の魔法使いであっても、あなたはスタック オーバーフローのドワーフを闇の森に送り込みました。あなたの問題は、コマンドのエスケープではありません。以下は問題なく動きます。

find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g'

これを空のディレクトリで実行してテストします。

$ mkdir tmp-gandalf
$ cd tmp-gandalf
$ find . -type f -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g'

シェルのエスケープに問題がある場合、システムはここで文句を言うでしょう。

これが問題です。コマンドの最初の部分は、操作するすべてのファイルを見つけます

find . -type f -print0

を使用すると、すべてのファイル-type fが検索されます。テキスト以外のファイルを含む。このコマンドは、テキスト以外のファイルを好みません。このようなことを試してくださいsed

sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g' /path/to/some.gif
find . -name '*.php' -o -name '*.xml' -o -name '*.phtml'

/path/to/some.gifバイナリファイルはどこにありますか。エラーが表示されますsed: RE error: illegal byte sequence。それsedは、「まあ、私はブラスターほど不器用でも無作為でもありません。私は、すべてがASCIIであったより文明化された時代から来ました」と言っています。

このスタックオーバーフローの質問には、少しハックな回避策があります(LANG属性を揺さぶる)。これが良い考えかどうか、私は信頼できるほど十分に知りません。

find私の個人的なアプローチは、特定の拡張子を持つファイルのみが含まれるように制限することです。オプションで複数の名前パターンを指定でき-oます。だから、このようなもの

//NOTE: each -o needs its own -print0
find . -name '*.php' -print0 -o -name '*.xml' -print0 -o -name '*.phtml' -print0 | xargs -0 sed -i '' 's/2013 Magento Inc./2012 Magento Inc./g'

.php、、.xmlおよび.phtmlファイルを検索します。別js-o -name '*.js'. 著作権表示のある Magento コード ベースには、ほんの一握りのファイル タイプしかないはずです。

于 2013-11-01T21:30:12.027 に答える
0

このsedを試してください:

 sed 's/\(©\) 2013 \(Magento\)/\1 2012 \2/g'
于 2013-11-01T19:27:52.583 に答える
0

単に括弧をエスケープするだけでうまくいくようです:

$ sed 's/\(c\) 2013 Magento/\(c\) 2012 Magento/g' <<< "@copyright   Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)"
@copyright   Copyright (c) 2013 Magento Inc. (http://www.magentocommerce.com)
于 2013-11-01T21:07:02.867 に答える