短消息;传递;“+99999999999”;“2012.06.23:21”;“”;“
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx“
我需要任何不以“sms;交付;”开头的行来添加到前面的行中。也就是说,得到这样的一条线:
短信;递送;“+99999999999”;“”;“2012.06.23:21”;“”;“
那是一行。另外,删除/替换xxxxx(内容)部分中的任何双引号也是有帮助的。
短信;递送;“+99999999999”;“”;“2012.06.23 09:21";"";"xxxxxxxxxxxxx,
因此,上面的行将被转换为这个(双引号转换为单引号):
短信;递送;“+99999999999”;“”;“2012.06.23 09:21";"";"xxxxxxxxxxxxx,
发布于 2012-06-23 14:32:51
下面的sed命令似乎可以满足您的需要(编辑:一个简短的sed命令,用于筛选引号):
sed '/^sms;deliver;/!'"y/\"/'/" yourfile | sed -n '/^sms;deliver;/!b;:r;${p;b};N;/\nsms;deliver;/!{s/\n//;br};P;s/.*\n//;br'简短的解释:
sed -n '# not print by default
/^sms;deliver;/!b # if line not starting with the pattern, goto end
:r #label r
${p;b} # if last line, print & exit
N # read new line, append to pattern space
/\nsms;deliver;/!{s/\n//;br} # if appended line doesn't start with pattern,
# remove newline & goto r
P # print everything up to the newline
s/.*\n//;br # remove what was just printed, goto r'最初的sed只在不与sms;delivered;联机时才将"更改为'
发布于 2012-06-23 14:43:00
这可能对你有用:
sed ':a;$!N;/\nsms;deliver;/!s/\n//;ta;:b;s/\(;".*\)"\([^";]*\)"\([^";]*"\)$/\1'\''\2'\''\3/;tb;P;D' file编辑:
"问题的测试数据:
echo 'sms;deliver;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxxx, xxxxxxxxxxxx xxxxxxxxxxxx "xxxx"xxxxxxxx"' >/tmp/a
sed ':a;$!N;/\nsms;deliver;/!s/\n//;ta;:b;s/\(;".*\)"\([^";]*\)"\([^";]*"\)$/\1'\''\2'\''\3/;tb;P;D' /tmp/a
sms;deliver;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxxx, xxxxxxxxxxxx xxxxxxxxxxxx 'xxxx'xxxxxxxx"
sed 's/xx/"&"/g' /tmp/a >/tmp/b
sed ':a;$!N;/\nsms;deliver;/!s/\n//;ta;:b;s/\(;".*\)"\([^";]*\)"\([^";]*"\)$/\1'\''\2'\''\3/;tb;P;D' /tmp/b
sms;deliver;"+99999999999";"";"";"2012.06.23 09:21";"";"'xx''xx''xx''xx''xx''xx'x 'xx''xx''xx''xx', 'xx''xx''xx''xx''xx''xx' 'xx''xx''xx''xx''xx''xx' ''xx''xx'''xx''xx''xx''xx'"https://stackoverflow.com/questions/11169974
复制相似问题