簡體   English   中英

awk / sed:用字符串替換其中具有換行符的模式

[英]awk / sed : replacing a pattern having newline character inside it with a string

文件看起來像這些。 我正在為目錄中的所有文件循環運行sed 他們有這樣的可變模式

模式1

colx ) AS 
( rightsaidfred, 

2

coly )     AS 
    ( rightsaidfred,

3

    colz)
AS 
        ( rightsaidfred,

在所有情況下我都想這樣替換

colN  , col1 ) 
AS 
( rightsaidfred,

我沒有GNU sed 只是標准的POSIX sed

sed 's/)*AS/col1,) \\ AS /g' file

不起作用。 注意,沒有GNU sed -i選項是out。 如果我想換行字符,我必須繼續enter '\\',然后按上面的enter鍵,但是上面給出的結果很奇怪。 其實以前的col名稱是變量,它不一樣
只是為了澄清Col1 col2 ..ColN是各種名稱。 跟蹤這些名稱很麻煩,這是awk試圖做的。我想要的是在那里找到一些實用程序,以查看是否使用此模式)*AS (其中*可以包含\\n字符,即

 ) 
AS

存在和替換是通過, col1 ) AS即我只是增加了一個逗號和在前面的COL1 )支架。 那就是我想做的。 在這種情況下,我嘗試在sed replace中使用% ,但是它不起作用。
sed 's/pattern/&replacement&/g' file不起作用。 我無法識別

 colx ) 
as 

圖案,其中as涉及到下一行(

輸入項

 col_frank ) as ( col_peter 
 col_oliver )        as       ( col_north
 col_dave ) 
as 
( col_sam 

輸出量

   col_frank,col1 ) as ( col_peter 
     col_oliver,col1 )        as       ( col_north
     col_dave,col1 ) 
    as 
    ( col_sam 


注意: 所有Col_names ,名稱如Col_frank,col_peter都是變量和非常 這里唯一不變的是)*as模式。 拼寫的圖案是
) followed by a boatload of anything including a newline char , followed by "as"
“ as”可能不區分大小寫。 這實際上是我正在修改的以前自行編寫的代碼。 一些AS字符串是ucase,其他是Lcase。


這是在AIX上。

給定您的新要求和示例輸入/輸出:

$ cat tst.awk
{ rec = rec $0 ORS }
END {
    gsub(/[[:space:]]*\)[[:space:]]*[aA][sS]/,",col1&",rec)
    printf "%s", rec
}

$ awk -f tst.awk file
 col_frank,col1 ) as ( col_peter
 col_oliver,col1 )        as       ( col_north
 col_dave,col1 )
as
( col_sam

GNU awk有一個更簡單的解決方案:

$ awk -vRS='^$' -vORS= '{gsub(/\s*\)\s*[aA][sS]/,",col1&")}1' file
 col_frank,col1 ) as ( col_peter
 col_oliver,col1 )        as       ( col_north
 col_dave,col1 )
as
( col_sam

但是由於您沒有GNU sed,所以我假設您也沒有GNU awk。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM