1

Perl スクリプトに次の行があります。

my $temp = `sed 's/ /\n/g' /sys/bus/w1/devices/w1_bus_master1/10-000802415bef/w1_slave | grep t= | sed 's/t=//'`;

「sed: -e expression #1, char 2: unterminated `s' command」というエラーが表示されます。

以下のようにシェル スクリプトを実行すると、正常に動作します。

temp1=`sed 's/ /\n/g' /sys/bus/w1/devices/w1_bus_master1/10-000802415bef/w1_slave | grep t= | sed 's/t=//'`
echo $temp1

誰でもアイデアはありますか?

4

2 に答える 2

4

Perl は your\nを文字通りの改行文字として解釈します。したがって、コマンド ラインは sed の観点からは次のようになります。

sed s/ /
/g ...

どのsedが好きではありません。シェルはそれをそのように解釈しません。

適切な解決策は、そのような状況で sed/grep をまったく使用しないことです。結局のところ、Perl はテキストの処理が非常に得意です。例(未テスト):

use File::Slurp;
my @lines = split m/\n/, map { s/ /\n/g; $_ } scalar(read_file("/sys/bus...));
@lines    = map { s/t=//; $_ } grep { m/t=/ } @lines;

\nまたは、一度エスケープしsed 's/ /\\n/g'...ます。

于 2012-11-08T12:17:18.193 に答える
1

\n最初の正規表現でエスケープする必要があります。perl の backtick-operator は、これを制御文字と見なし、string の代わりに改行を挿入します\n

                     |
                     V
my $temp = `sed 's/ /\\n/g' /sys/bus/ # ...
于 2012-11-08T12:15:19.207 に答える