4

ファイルリスト内のテキストをawkで置き換えたい。このため、これは仕事に適したツールだと思います。

「テキストファイルを操作するとき、いくつかの種類のタスクが繰り返し発生します。特定の行を抽出して残りを破棄することもできます。または、特定のパターンが表示される場所で変更を加え、ファイルの残りの部分はそのままにしておく必要があります。」

http://www.gnu.org/software/gawk/manual/gawk.html

それがまさに私がやりたいことです。

awkはfilelist.txt(これは変更される各ファイルへのパスを含むファイルです)を読み取り、pattern.txt(これはjavascriptを含むファイルであり、filelistに含まれるすべてのhtmファイルからカリングしたいものです)と一致します。 TXT)

filelist.txtを使用する理由は、javascriptを削除したいファイルがいくつかあり、それらが複数の場所にあるためです。

私がpattern.txtを使用したい理由は、javascriptにスペースや特殊文字など、あらゆる種類のものが含まれているためです。

javascript全体をawkにフィードしようとすると、そこに含まれるすべての特殊文字を次々にエスケープする必要があり、非常に時間がかかります。(そしておそらく機能せず、信じられないほど複雑になるでしょう!)

次のように、JavaScriptの先頭と末尾だけを配置しようとすると、次のようになります。

awk '/<\/SCRIPT>/{p=1;print}/<\/script>/{p=0}!p'    

目的のインスタンスだけでなく、埋め込まれたjavascriptのすべてのインスタンスを削除するリスクがあります。

私がやろうとしていることはawkで実現可能ですか?

これは、ファイルを提供することで、ファイルのコンテンツ全体をパターンとして解釈し、遭遇した最初のシンボルを窒息させないという私の信念に基づいています。

4

3 に答える 3

2

awkそれがこの仕事に適したツールかどうかはわかりません。通常は標準出力に出力されますが、元のファイルを上書きしたいようです。

そのために、Perl には組み込みのメカニズムperl -i.bakがあります。ファイルを上書きし、オプションの接尾辞 を付けて各ファイルのバックアップ コピーを作成します.bak。サフィックスを省略すると、バックアップは取得されません。

パターン マッチングのシナリオを正しく理解できれば、データ ファイルから削除する必要がある 1 行にかなりの量の JavaScript コードが含まれていることになります。ただし、これらのファイルには JavaScript の他のフラグメントが含まれている可能性があるため、単純な開始点を持つ行を単純に探すことはできません。繰り返しますが、Perl の方が優れていると思います。ファイルを変数に読み込み、pattern.txtその変数から適切な修飾を使用して正規表現を作成して、メタ文字のすべての特別な意味を抑制することができます (\Qそして\E; JavaScript には\E? が含まれます)。Perl を使用すると、ファイル全体をメモリに丸呑みしてから、複数行の正規表現をファイル全体に適用できます — このコードでよく使用されるプロパティです。丸呑みが-iオプション; それはチェックする必要があります。

これらの特別なトリックはどれawkも (でさえも) すぐに利用できないため、おそらくこの仕事に最適なツールではないgawkと思います。awkPerl はずっと前に習ったので使っています。Python、Ruby、またはその他の新しいスクリプト言語でも、それを管理できる可能性が高いと思います。


Perl デモ

slurper.pl

#!/usr/bin/perl -i.bak
use strict;
use warnings;

my $pattfile = shift;
my $pattern;
{
    open my $ph, '<', $pattfile or die "Failed to open $pattfile: $!";
    local $/;
    $pattern = <$ph>;
}

# chomp removes what's in $/ - don't chomp while $/ is undef!
chomp $pattern;

my $regex = qr{ \Q$pattern\E }mx;

# Slurp each file in turn
local $/;
while (<>)
{
    s/$regex//g;
    print;
}

p:

X ok X ok

バツ:

abcXdef
X ok X ok

y:

abcXdef
X ok X ok
no x's here

z:

no x's here either
abcXdef
X ok X ok

実行する

$ perl slurper.pl p x y z
$ ls ? ?.bak
p     x     x.bak y     y.bak z     z.bak
$

p:

X ok X ok

バツ:

abcXdef

y:

abcXdef

no x's here

z:

no x's here either
abcXdef
于 2012-04-13T10:05:17.933 に答える
0

TXRは、ファイル全体のパターンマッチングを実行します。TXRパターンでは、1文字をエスケープするだけです@。これには特別な意味があるので、リテラルをエンコードするには@、と書くだけ@@です。(もう1つの文字には特別な意味があります。実際には、単一のスペース(つまり、別のスペースに隣接していない)です。これは、「1つ以上のスペースに一致する」という正規表現として扱われます。これは、よくある少しのたるみです。

@(collect)
@  (cases)
text you want to
change to something
else
@    (output)
multi line
replacement
@    (end)
@  (or)
@line
@    (output)
@line
@    (end)
@  (end)
@(end)

この言語は、テキストの連なりを同じに保ち、いくつかの場所で置き換えるだけのテキストフィルタリングにはあまり向いていませんが、少しのコーディングで機能します。ここでは、@(collect)2つのパターンマッチングケースを含むライン指向があります。マルチラインのものと、1つのラインを取得するためのフォールバックケースです。複数行のものが一致する場合、入力は自動的にそれを超えて進みます。文字ではなく行を超えることを除けば、トークン化に似ています。

末尾のコンテキスト(消費されない)を@(trailer)、たとえばと一致させることができます。

text you want to
change to something
else
@(trailer)
which must be followed by
this part that is not
consumed; and the match
continues within this part

別のファイルに変更したいテキストは、別のファイルにあるパターン関数に分解できます。

@(define matchtext)
text you want to
change to something
else
@(end)
@(define replacement)
@  (output)
multi line
replacement
@  (end)    
@(end)

次に、ちょうど:

@(load "text-and-replacement")
@(collect)
@  (cases)
@    (matchtext)
@    (replacement)
@  (or)
@line
@    (output)
@line
@    (end)
@  (end)
@(end)
于 2012-04-13T20:19:24.790 に答える
0

コマンドラインで失敗しましたが、タスクは成功しました。

easy find found @ http://www.devon-technologies.comというプログラムを使用し、変数 createDocumentFragm を使用して、変更されたすべてのドキュメントを検索しました。

次に、@ http://searchreplaceapp.comで見つかった Search&Replace を使用し、開始と終了のスクリプト タグを除いて JavaScript 全体を貼り付け、2 回目のパスでファイルを手動で非表示にしてから、12 の JavaScript のグロブを手動で削除しました。 find&replace がクラッシュする原因となった 1050。これらを手作業で編集する必要がありました。

だから...コマンドラインで失敗し、ラメオGUIツールを渡します。

皆様、ご回答ありがとうございます。

:(

(近い将来、同様の事例に出くわすと思うので、Perl を学ぶ必要があると思います。これは価値のある努力です。)

于 2012-04-13T17:18:48.280 に答える