2009-04-16 19 views
6

要添加上述每一個你的正則表達式匹配的行空行,你可以使用:外殼:插入一個空白/新線兩線上面的圖案

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

但我想添加一個空行,不一行以上行,但兩行行符合我的正則表達式。

我將匹配的模式是地址行中的郵政編碼。

這裏是文本的格式的一個片段:

隨機信息(屬於以前的業務)
企業名稱
商家地址

例如:

使用的語言:英語
阿諾德灣,Nfld(子要克拉倫維爾)
尼羅河道,阿諾德灣,NL,A0B1N0

我想補充的企業名稱的上方插入新行:

用語言:英語

阿諾德灣,Nfld(子要克拉倫維爾)
尼羅河道,阿諾德灣,NL,A0B1N0

回答

5

東西有點像原來的做法在sed:

sed '/regexp/i\ 

$H 
x' 

的基本思想是打印一切由一條線(X變化保持和模式空間 - 印刷是隱含的)延遲。這需要完成,因爲直到我們檢查下一行是否匹配正則表達式,我們不知道是否要i插入換行符。

(該$ H有剛有辦法可以把最後一行打印其追加的最後一行到保持緩衝器,使最終隱含的打印命令輸出過。)

0

我試過

sed '/regexp/a\\n' 

但它插入了兩條換行符。如果那不妨礙你,就拿它。

echo -e「a \ nb \ nc」| SED '/^A $/A \ N'
一個

b
Ç

編輯: 現在你的狀態,你需要插入匹配的正則表達式上面兩行的建議正則表達式不起作用。

我甚至不確定它是否可以使用sed,因爲您需要記住過去的行。聽起來像python或perl等更高級語言的工作:-)

+0

即插入模式下面兩條新線... – Dennis 2009-04-16 19:01:23

+0

是啊,這就是我說的:-) – lothar 2009-04-16 19:07:44

+0

謝謝,我會編輯我的問題,包括Python和Perl代碼(我知道一點的Python和沒有Perl,所以不幸我仍然陷入困境。) – Dennis 2009-04-16 20:20:34

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類。

2
perl -ne 'END{print @x} [email protected],$_; if(@x>2){splice @x,1,0,"\n" if /[[:alpha:]]\d[[:alpha:]]\s?\d[[:alpha:]]\d/;print splice @x,0,-2}' 

如果我的貓你的文件到這一點,我得到你想要的東西......它的醜陋,但你想要的外殼(即,一個班輪):-)如果我是這樣做全面的Perl,我可以清理它很多,使它可讀。 :-)

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 =(); 
    } 
} 
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'