-1

ファイルには次が含まれます。

    rhost=localhost
    ruserid=abcdefg_xxx
    ldir=
    lfile=
    rdir=p01
    rfile=
    pgp=none
    mainframe=no
    ftpmode=binary
    ftpcmd1=
    ftpcmd2=
    ftpcmd3=
    ftpcmd1a=
    ftpcmd2a=
    notifycc=no
    firstfwd=Yes
    NOTIFYNYL=
    decompress=no
    compress=no

その2行目の「_xxx」を削除する簡単なコードを書きたいと思います。文字列「_xxx」を含むファイルは決してないので、非常に簡単になることに注意してください。私は構文にあまり慣れていません。ありがとう!

4

4 に答える 4

3

簡単な答え:

文字通りの''だけを削除する方法は次のとおりです_xxx

perl -pli.bak -e 's/_xxx$//' filename

詳細な説明:

Perlはラインノイズと見分けがつかないコードで定評があるので、ここで手順の説明をします。

-p次のような暗黙のループを作成します。

while( <> ) {
    # Your code goes here.
}
continue {
    print or die;
}

-l一種の「自動チョップ」のように機能しますが、再度印刷する前に、行末の行をその行に戻します。それよりも複雑ですが、最も単純な使用法では、暗黙のループを次のように変更します。

while( <> ) {
    chomp;
    # Your code goes here.
}
continue {
    print $_, $/;
}

-私はPerlに「その場で編集する」ように指示します。舞台裏では、別の出力ファイルを作成し、最後にその一時ファイルを移動して元のファイルを置き換えます。

.bak'originalfileという名前のバックアップを作成する必要があることをPerlに通知します。bak 'を使用すると、間違えた場合でも簡単に元に戻すことができます。

置換の内部:

s/
    _xxx$     # Match (but don't capture) the final '_xxx' in the string.
 /$1/x;       # Replace the entire match with nothing. 

参考資料:

今後の参考のために、Perlの「ワンライナー」で使用されるコマンドラインスイッチに関する情報は、perlrunのPerlのドキュメントで入手できます。Perlの正規表現の簡単な紹介は、perlrequickにあります。また、Perlの構文の概要はperlintroにあります。

于 2012-07-10T20:00:51.830 に答える
1

多分これは助けることができます

perl -ple 's/_.*// if /^ruserid/' < file

「ruserid」で始まる行の最初の「_」(含まれている)以降はすべて削除されます。

于 2012-07-10T20:00:20.097 に答える
1

これにより、元のファイルが上書き_xxxされ、2 行目が削除されます。

use warnings;
use strict;
use Tie::File;

my $filename = shift;
tie my @lines, 'Tie::File', $filename or die $!;
$lines[1] =~ s/_xxx//;
untie @lines;
于 2012-07-10T19:42:21.540 に答える
0

を使用した片道perl。2 行目 ( ) で、最後から行末まで$. == 2を削除します。_

perl -lpe 's/_[^_]*\Z// if $. == 2' infile
于 2012-07-10T19:37:34.957 に答える