文件看起来像这些。我在循环中为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上。
答案 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。