0

sedテキストファイルからすべてのコメントを削除するために使用したいと思います。コメントが「A」文字から始まり、改行文字で終わるとしましょう。「A」から改行文字を含む行末までのすべてを削除したいと思います。ただし、「AA」から始まるコメントは削除したくありません。

サンプル入力:

%% comment to do not delete
% comment to delete
% another comment to delte
%% comment to do not delete
Some text % comment to delete
and some more text %% comment to do not delete

望ましい出力:

%% comment to do not delete
%% comment to do not delete
Some text and some more text %% comment to do not delete
4

5 に答える 5

2

perl の否定後読みアサーションの完全な適用:

perl -pe 's/(?<!%)%(?!%).*$//s' << END
%% comment to do not delete
% comment to delete
% another comment to delte
%% comment to do not delete
Some text % comment to delete
and some more text %% comment to do not delete
END

出力

%% comment to do not delete
%% comment to do not delete
Some text and some more text %% comment to do not delete

このsフラグは、ドットが改行と一致して、要求どおりに「行の結合」を実現することを保証します。

この種の正規表現マッチングは、たとえば次のような行がある場合に問題を引き起こす可能性があります

The date is `date +%Y%m%d` % this is a comment

あなたはで終わるでしょう

The date is `date +

実際のコメントの前後に空白が必要な場合は、次の正規表現を使用できます。

(^| )%( .*|)$

つまり

  • 行頭またはスペース
  • コメント文字が続きます
  • (スペースと 0 個以上の文字) が続く、または何もない
  • 続いて行末
于 2013-03-17T18:38:24.383 に答える
2

これをやってみてください:

$ perl -pe '/^[^%]*%%/ && next; s/%.*\n//g' file.txt

出力

%% comment to do not delete
%% comment to do not delete
Some text and some more text %% comment to do not delete

ノート

ファイルをその場で変更する必要がある場合は、-i(テスト後に) スイッチを追加します。

$ perl -i -pe '/^[^%]*%%/ && next; s/%.*\n//g' file.txt

寄稿してくれた精査者に感謝します。

于 2013-03-17T14:58:06.880 に答える
0

Sed で式の順序を使用する

sed では、命令の順序が重要になる場合があります。例えば:

$ sed -ne '/^% /d; /[^%]%.*/ {s/%.*//; n}; p' /tmp/corpus 
%% comment to do not delete
%% comment to do not delete
and some more text %% comment to do not delete

この例では、sed スクリプトは次の順序でタスクを実行します。

  1. 出力を抑制します。
  2. 1 つのパーセント記号で始まる行を削除します。
  3. 置換を使用して、1 つのパーセントから行末までのすべての文字を削除し、次の行を改行なしでパターン スペースに追加します。
  4. パターンスペースを印刷します。

このスクリプトは、質問で提供したコーパスで動作します。変更なしで他のコーパスで動作することは保証されておらず、パターン スペースに追加する行にコメント文字が含まれている場合は明示的に動作しません。

于 2013-03-17T17:41:33.537 に答える
0

編集ファイルの最後の行でうまく機能するように変更を追加しました...試してください:

sed -e :a -e '/^[^%]*%%/n; /%/{s/%.*//; N; s/\n//;};ta' file

入力でテスト済み:

%% comment to do not delete
% comment to delete
% another comment to delte
%
%% comment to do not delete
Some text % comment to delete
Some more text % more comment to delete
and some more text %% comment to do not delete
fdgdfgdgdgd %
gfdgd
some text followed by %% comment to not delete that contains a % somewhere
some text followed by % comment to delete that contains %% somewhere
hello there

出力:

%% comment to do not delete
%% comment to do not delete
Some text Some more text and some more text %% comment to do not delete
fdgdfgdgdgd gfdgd
some text followed by %% comment to not delete that contains a % somewhere
some text followed by hello there
于 2013-03-17T16:30:53.840 に答える