【发布时间】:2016-02-16 18:20:40
【问题描述】:
文件看起来像这样。我正在为目录中的所有文件循环运行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 。如果我想换行 char 我必须继续使用 '\' 然后按enter 就像上面一样,但上面给出了奇怪的结果。实际上以前的 col 名称是可变的
它不一样
只是为了澄清 Col1 col2 ..ColN 是不同的名称。跟踪这些名称很麻烦,这就是awk 正在尝试做的事情。我想要的只是一些实用程序来查看这种模式)*AS (其中* 可以包含\n char 即
)
AS
Exists and Replace 是 , 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_frank,col1 ) as ( col_peter
col_oliver,col1 ) as ( col_north
col_dave,col1 )
as
( col_sam
注意:all Col_names,像 Col_frank、col_peter 这样的名字是 variables 和非常量。这里唯一不变的是)*as 模式。拼出的模式是 ) followed by a boatload of anything including a newline char , followed by "as"
“as”可能不区分大小写。这实际上是我正在修改的以前自制的代码。一些 AS 字符串是 ucase 其他是 Lcase。
这是在 AIX 上的。
【问题讨论】:
-
任何时候你发现自己在说
I am running a sed in a loop,停止并开始寻找更好的解决方案。见unix.stackexchange.com/questions/169716/…。 -
我不会担心性能。如果 # 个文件很大,你有一个 imp pt。那么对此有什么想法吗?
-
我的评论不仅仅是关于性能,而是关于健壮性、可维护性、可移植性和其他优秀软件的理想品质。我发布了一个答案。
-
尝试做错并不比简单地做对更快或更容易。
-
我不想继续猜测和剥洋葱的要求,所以请编辑您的问题,以简单地提供一个简洁、可测试的示例输入文件和给定该输入的精确预期输出。跨度>