1

私はこれに何時間も費やしましたが、それをクラックすることはできません。OSXでsedを使用しています。

これはコードです:

sed -i.bak "s/^\(\$dokuwiki_hash.*\)$/\1\n    '"$date"'   => '"$hash"',/" install.php

そして、私が得る間違った出力は次のとおりです(最初の行を参照):

$dokuwiki_hash = array(n    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623',
    '2005-09-22'   => 'e33223e957b0b0a130d0520db08f8fb7',
    '2006-03-05'   => '51295727f79ab9af309a2fd9e0b61acc',                                                                                                       
    '2006-03-09'   => '51295727f79ab9af309a2fd9e0b61acc',
    '2006-11-06'   => 'b3a8af76845977c2000d85d6990dd72b',
    '2007-05-24'   => 'd80f2740c84c4a6a791fd3c7a353536f',
    '2007-06-26'   => 'b3ca19c7a654823144119980be73cd77',
    '2008-05-04'   => '1e5c42eac3219d9e21927c39e3240aad',
    '2009-02-14'   => 'ec8c04210732a14fdfce0f7f6eead865',
    '2009-12-25'   => '993c4b2b385643efe5abf8e7010e11f4',
    '2010-11-07'   => '7921d48195f4db21b8ead6d9bea801b8',
    '2011-05-25'   => '4241865472edb6fa14a1227721008072',
    '2011-11-10'   => 'b46ff19a7587966ac4df61cbab1b8b31',
    '2012-01-25'   => '72c083c73608fc43c586901fd5dabb74',
    '2012-09-10'   => 'eb0b3fc90056fbc12bac6f49f7764df3',
    '2013-04-06'   => '7b62b75245f57f122d3e0f8ed7989623',
);

以下のような新しい行にあるはずです。

$dokuwiki_hash = array(
    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623',
    '2005-09-22'   => 'e33223e957b0b0a130d0520db08f8fb7',
    '2006-03-05'   => '51295727f79ab9af309a2fd9e0b61acc',                                                                                                       
    '2006-03-09'   => '51295727f79ab9af309a2fd9e0b61acc',
    '2006-11-06'   => 'b3a8af76845977c2000d85d6990dd72b',
    '2007-05-24'   => 'd80f2740c84c4a6a791fd3c7a353536f',
    '2007-06-26'   => 'b3ca19c7a654823144119980be73cd77',
    '2008-05-04'   => '1e5c42eac3219d9e21927c39e3240aad',
    '2009-02-14'   => 'ec8c04210732a14fdfce0f7f6eead865',
    '2009-12-25'   => '993c4b2b385643efe5abf8e7010e11f4',
    '2010-11-07'   => '7921d48195f4db21b8ead6d9bea801b8',
    '2011-05-25'   => '4241865472edb6fa14a1227721008072',
    '2011-11-10'   => 'b46ff19a7587966ac4df61cbab1b8b31',
    '2012-01-25'   => '72c083c73608fc43c586901fd5dabb74',
    '2012-09-10'   => 'eb0b3fc90056fbc12bac6f49f7764df3',
    '2013-04-06'   => '7b62b75245f57f122d3e0f8ed7989623',
);

どんな助けでも大歓迎です!

4

2 に答える 2

1

これの代わりに使用しないでください。sed改行や正規表現の結果の保存をいじることなく、現在の行の後に行を追加するための完全に優れた追加コマンドがあります。

pax> echo '$dokuwiki_hash = array(
    '"'"'2013-03-17'"'"'   => '"'"'7b62b75245f57f122d3e0f8ed7989623'"'"'
);' | sed '/^\$dokuwiki_hash = /a\    blah '"'"'blah'"'"' blah'
$dokuwiki_hash = array(
    blah 'blah' blah
    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623'
);

引用符を使用した策略は、コマンド内に文字通りの一重引用符を入れることができるようにすることです。

または、外側で二重引用符を使用することもできます。シェルがドル変数を解釈しないように注意する必要があります。

pax> echo "\$dokuwiki_hash = array(
    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623'
);" | sed "/^\$dokuwiki_hash = /a\    blah 'blah' blah"

$dokuwiki_hash = array(
    blah 'blah' blah
    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623'
);

現在の行の前iに挿入するための反対の挿入コマンドもありますが、この場合は必要な追加です。


bashまた、引用符の種類を混在させるのに問題がある場合(おそらく、OSXでの古いものが原因)、sedコマンドをファイルに入れて、sed -fそれらを実行するために使用できます。

pax> cat qq.sed

/^$dokuwiki_hash = /a\    blah 'blah' blah

pax> echo '$dokuwiki_hash = array(
    '"'"'2013-03-17'"'"'   => '"'"'7b62b75245f57f122d3e0f8ed7989623'"'"'
);' | sed -f qq.sed

$dokuwiki_hash = array(
    blah 'blah' blah
    '2013-03-17'   => '7b62b75245f57f122d3e0f8ed7989623'
);

これは、シェルとの間の引用の戦いを回避しますsedそれでも機能しない場合は、このリンクを参照してください。代わりにGNUsedをインストールすることをお勧めします。

于 2013-03-17T01:54:30.037 に答える
1

\n通常の置換コマンドの置換部分では、改行文字としてサポートされていませんsed( のみGNU sed)。

たとえば、パターンの先頭に改行を追加するには、

sed 's/pattern/\n&/' file

使用する

sed 's/pattern/\
&' file

行の\最後の文字にする必要があります。

于 2013-03-17T10:55:50.323 に答える