2012-07-23 33 views
1

如果找到匹配項,我可以使用sedawk追加到上一行嗎?追加到上一行的匹配

我有有格式的文件:

  INT32 
      FSHL (const TP Buffer) 
      { 
      INT32 
      FSHL_lm (const TP Buffer) 
      { WORD32 ugo = 0; ... 

我所試圖做的是掃描獨立的開括號{並將其追加到以前的非空行.The比賽不應該發生由同一行中的任何內容附加的開放大括號。

預期的輸出:

  INT32 
      FSHL (const TP Buffer){ 
      INT32 
      FSHL_lm (const TP Buffer) 
      { WORD32 ugo = 0; ... 

感謝您的答覆。

回答

6

這可能爲你工作(GNU SED):

sed '$!N;s/\n\s*{\s*$/{/;P;D' file 

說明:

  • $!N除非最後一行追加下一行到模式空間。
  • s/\n\s*{\s*$/{/替換一個換行,然後是no或任何數量的空格,然後是一個開放的花括號,然後是no或任何數量的空格到字符串的末尾。
  • P打印幷包括第一個換行符。
  • D刪除幷包括第一個換行符(如果是的話不要開始新的循環)。
+0

偉大的作品!你能否給你的正則表達式添加簡短的描述:) – Gil 2012-07-23 18:35:19

+0

@Geekasaur請參閱解釋。 – potong 2012-07-23 19:53:49

2

單程使用perl。我以slurp模式讀取所有文件,並使用正則表達式搜索只有大括號的行,並刪除其前導空格。

perl -ne ' 
    do { 
     local $/ = undef; 
     $data = <>; 
    }; 
    $data =~ s/\n^\s*(\{\s*)$/\1/mg; 
    print $data 
' infile 

假設infile與問題的內容,輸出將是:

FSHL (const TP Buffer){ 
INT32 
FSHL_lm (const TP Buffer) 
{ WORD32 ugo = 0; ... 
+0

爲perl替代+1 +1 – Gil 2012-07-23 18:27:43

2

一種使用awk方式:

awk '!(NF == 1 && $1 == "{") { if (line) print line; line = $0; next; } { sub(/^[ \t]+/, "", $0); line = line $0; } END { print line }' file.txt 

或者多行細分:

!(NF == 1 && $1 == "{") { 
    if (line) print line 
    line = $0 
    next 
} 

{ 
    sub(/^[ \t]+/, "", $0) 
    line = line $0 
} 

END { 
    print line 
} 

個結果:

INT32 
      FSHL (const TP Buffer){ 
      INT32 
      FSHL_lm (const TP Buffer) 
      { WORD32 ugo = 0; ... 

HTH

+0

如果在大括號之後有空格,則正則表達式'!/ {$ /'將失敗。對於像'[{'這樣的行,因爲它沒有檢查任何內容。也許OP可以和它一起生活,但我會用更緊的'!(NF == 1 && $ 1 ==「{」)'或'!/^* {* $ /'來代替。 – Birei 2012-07-23 11:36:59

+0

@Birei:謝謝,你說得對。我沒有考慮過除空白以外的其他字符。出於某種原因,我不認識。 – Steve 2012-07-23 12:21:00

+0

@steve謝謝!適用於我的情況;) – Gil 2012-07-23 18:25:13

0

[希亞姆@本地〜] $ perl的-lne的/ ^/\ N /如果$> 1 & &/^ \ d + /。 printf「%s」,$ _'appendDateText。TXT

,將工作

I/P:

2016年6月12日20:30測試測試測試

TESTTEST

2019年6月12日20:30 ABBS abcbcb abcbc

2016年6月11日20時30分試考試

i123312331233123312 331233123312331233123312331233Test

2016年6月12日20時30分ABC

O/P:

2016年6月12日20點30測試測試TestTestTest

2019年6月12日20時30 ABBS abcbcb abcbc

2016年6月11日20:30測試## testi123312331233123312331233123312331233123312331233Test