[英]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.