我想将多行包含更改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