【问题标题】:awk / sed : replacing a pattern having newline character inside it with a stringawk / sed :用字符串替换其中包含换行符的模式
【发布时间】: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。那么对此有什么想法吗?
  • 我的评论不仅仅是关于性能,而是关于健壮性、可维护性、可移植性和其他优秀软件的理想品质。我发布了一个答案。
  • 尝试做错并不比简单地做对更快或更容易。
  • 我不想继续猜测和剥洋葱的要求,所以请编辑您的问题,以简单地提供一个简洁、可测试的示例输入文件和给定该输入的精确预期输出。跨度>

标签: regex shell unix awk sed


【解决方案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。

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 2017-02-08
    • 2015-01-13
    • 2016-10-29
    • 2012-06-30
    • 2014-10-19
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多