6

正規表現に一致するすべての行の上に空白行を追加するには、次を使用できます。

sed '/regexp/{x;p;x;}'

しかし、正規表現に一致する行の1行上ではなく、2行上に空白行を追加したいと考えています。

照合するパターンは、住所行の郵便番号です。

テキストの書式設定のスニペットを次に示します。

任意の情報 (以前のビジネスに属します)
ビジネス名
ビジネス住所

例えば:

話されている言語: 英語
Arnold's Cove, Nfld (Clarenville にサブ)
Nile Road, Arnolds Cove, NL, A0B1N0

ビジネス名の上に新しい行を追加したい:

話されている言語: 英語

Arnold's Cove, Nfld (Clarenville へのサブ)
Nile Road, Arnolds Cove, NL, A0B1N0

4

6 に答える 6

7

読みやすい Perl であり、複数のファイルを適切に処理します。

#!/usr/bin/env perl
use constant LINES => 2;
my @buffer = ();
while (<>) {
    /pattern/ and unshift @buffer, "\n";
    push @buffer, $_;
    print splice @buffer, 0, -LINES;
}
continue {
    if (eof(ARGV)) {
        print @buffer;
        @buffer = ();
    }
}
于 2009-04-16T20:55:45.863 に答える
5

sed での元のアプローチに少し似ています。

sed '/regexp/i\

$H
x'

基本的な考え方は、1 行遅れてすべてを出力することです ( xホールドとパターンのスペースを変更します - 印刷は暗黙的です)。次の行が正規表現と一致するかどうかを確認するまで、改行を挿入するかどうかがわからないため、これを行う必要があります。

( $H は、最後の行を印刷するための単なるトリックです。最後の暗黙的な印刷コマンドもそれを出力するように、最後の行をホールドバッファーに追加します。)

于 2009-04-16T21:18:18.633 に答える
3

単純:

sed '1{x;d};$H;/regexp/{x;s/^/\n/;b};x'

説明してください

#!/bin/sed

# trick is juggling previous and current line in hold and pattern space

1 {         # at firs line
  x         # place first line to hold space
  d         # skip to end and avoid printing
}
$H          # append last line to hold space to force print
/regexp/ {  # regexp found (in current line - pattern space)
  x         # swap previous and current line between hold and pattern space
  s/^/\n/   # prepend line break before previous line
  b         # jump at end of script which cause print previous line
}
x           # if regexp does not match just swap previous and current line to print previous one

編集:少し単純なバージョン。

sed '$H;/regexp/{x;s/^/\n/;b};x;1d'
于 2009-04-17T10:41:04.727 に答える
2
perl -ne 'END{print @x} push@x,$_; if(@x>2){splice @x,1,0,"\n" if /[[:alpha:]]\d[[:alpha:]]\s?\d[[:alpha:]]\d/;print splice @x,0,-2}'

私があなたのファイルをこれに入れると、私はあなたが望むものを手に入れます...それは醜いですが、あなたはシェル(つまり、ワンライナー)を望んでいました:-)これを完全なperlで行うとしたら、きれいにすることができます読みやすくするために多くのことを行います。:-)

于 2009-04-16T20:47:56.023 に答える
1

これは、Python で機能するアプローチです。

import sys
def address_change( aFile ):
    address= []
    for line in aFile:
        if regex.match( line ):
            # end of the address
            print address[0]
            print 
            print address[1:]
            print line
            address= []
         else:
            address.append( line )
address_change( sys.stdin )

これにより、完全なアドレスを心ゆくまで再フォーマットできます。Addressフォーマットが複雑な場合は、これを展開してクラスを定義できます。

于 2009-04-16T20:36:18.140 に答える
0

私は試した

sed '/regexp/a\\n'

しかし、2つの改行が挿入されました。それが気にならない場合は、それを取ってください。

echo -e "a\nb\nc" | sed '/^a$/a\n'
a

紀元前
_

編集: 一致する正規表現の上に2行挿入する必要があると述べたので、提案された正規表現は機能しません。

過去の行を覚えておく必要があるため、sedでまったく機能するかどうかさえわかりません。python や perl のような高水準言語の仕事のように聞こえます :-)

于 2009-04-16T18:55:30.647 に答える