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