仅在由keywork

时间:2015-08-17 11:30:41

标签: sed

我想处理某些文件中的文本,有时表达式存在于一行中,有时则存在于多行

例如在多行

myfunc(param1,
param2,
param3);

或一行

myfunc(param1, param2, param3);

是否存在sed仅在myfunc;之间处理文字的方法?关键字

在第一步这有助于我将所有多行移植到一行。然后我可以做一个线型

我的manupulation

如果可能的话?

2 个答案:

答案 0 :(得分:1)

Sed用于单个行上的简单替换,即全部。对于任何更有趣的东西,你应该使用awk。这样的事情可能就是你想要的:

$ cat file
myfunc(param1,
param2,
param3);

myfunc(param1, param2, param3);

$ cat tst.awk
/myfunc/ { buf=""; inBlock=1 }
inBlock {
    buf = (buf==""?"":buf RS) $0
    if (/;/) {
        $0 = buf
        sub(/param2/,"lets have a tea party")
        inBlock = 0
    }
}
!inBlock

$ awk -f tst.awk file
myfunc(param1,
lets have a tea party,
param3);

myfunc(param1, lets have a tea party, param3);

只需将sub(/param2/,"lets have a tea party")行替换为您真正想要对myfunc;之间的文本块进行的操作。

答案 1 :(得分:0)

您可以使用以下sed脚本:

extract.sed:

# Check for "my"
/\bmy\b/    {   
    # Replace everything in front of
    # my (including it)
    s/.*\bmy\b//
    # Define a label "a"
    :a  
    # If the line does not contain "processes"
    /\bprocesses\b/!{
        # Get the next line of input and append
        # it to the pattern buffer
        N   
        # Branch back to label "a"
        ba  
    }   
    # Replace "processes" and everything after it
    s/\bprocesses\b.*//
    # Print the pattern buffer
    p   
}

这样称呼:

sed -nf extract.sed input.txt