如何替换文件中的一行行?

如何替换文件中的一行行?

我想将多行包含更改foo2为所需的输出
foo2就像多行中的数组一样,如何将其更改为一行

  • 从:
$ cat file.txt
foo1=bar1
foo2=('bar10: some text here'
      'bar11: anther text here'
       ...
      'bar: final text here')
foo3=('bar3')
foo=1.2.33

  • 到:
foo1=bar1
foo2="bar10 bar11 .. bar"
foo3=('bar3')
foo=1.2.33

答案1

在每个 Unix 机器上的任何 shell 中使用任何 awk 并假设...输入中的行和..输出中的字符串实际上并不存在于您的真实数据中,并且旨在表示与它们周围的文本类似的文本:

$ cat tst.awk
(val=="") && /.*\047$/ {
    tag = $0
    sub(/=.*/,"",tag)
    val = ""
}
tag != "" {
    split($0,f,/[\047:]/)
    val = (val == "" ? "" : val " ") f[2]
    if ( /\)$/ ) {
        print tag "=\"" val "\""
        tag = ""
    }
    next
}
{ print }

$ awk -f tst.awk file.txt
foo1=bar1
foo2="bar10 bar11 bar"
foo3=('bar3')
foo=1.2.33

答案2

sed

sed -n '/^foo2=(/ba;p;d;:a N;/)$/!ba;s/\n//g;s/  */ /gp' file1

perl

perl -pe '
    $_ = /[)]$/ ? s/  */ /gr : 
    (substr $_, 0, -1) =~ s/  */ /gr
        if /^foo2=[(]/ .. /[)]$/
' test

或者如果您的perl版本没有r替换修饰符s

perl -pe '
    $_ = /[)]$/ ? $_ : substr $_, 0, -1 and s/  */ /g 
        if /^foo2=[(]/ .. /[)]$/
' test

相关内容