awk / sed:用字符串替换其中包含换行符的模式

时间:2016-02-16 18:20:41

标签: regex shell unix awk sed

文件看起来像这些。我在循环中为dir中的所有文件运行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选项。如果我想要换行符,我必须继续使用'\',然后像上面那样按enter,但上面给出了奇怪的结果。实际上以前的col名称是可变的 它不一样只是为了澄清Col1 col2 ..ColN是各种各样的名字。跟踪这些名称是很麻烦的,这是awk正在尝试做的事情。我想要的是一些实用工具,看看这个模式)*AS(其中*可以包含{{1} char ie

\n

存在和替换是 ) AS ,即我刚刚在, col1 ) AS括号前面添加了一个逗号和一个col1。这就是我想要做的。 在这种情况下,我尝试使用)替换中的%,但它不起作用 sed 不起作用。我无法识别

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_names ,Col_frank,col_peter等名称是变量和非常量。这里的唯一事物常量是 col_frank,col1 ) as ( col_peter col_oliver,col1 ) as ( col_north col_dave,col1 ) as ( col_sam 模式。拼写的模式是)*as
“as”可能不区分大小写。这实际上是我正在修改的以前自制的代码。一些AS字符串是ucase,其他字符串是Lcase。


这是在AIX上。

1 个答案:

答案 0 :(得分:1)

鉴于您的新要求和样本输入/输出:

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