繁体   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