【问题标题】:Add lines not beginning with specific regex to previous line将不以特定正则表达式开头的行添加到上一行
【发布时间】:2012-06-25 13:34:35
【问题描述】:

短信;投递;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxx,
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx”

我需要任何不以“sms;deliver;”开头的行被添加到上一行。即得到这样一条线:

短信;投递;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxxx,xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx”

^ 那是一行。此外,删除/替换 xxxxx(content) 部分中的任何双引号也会很有帮助。

sms;deliver;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxxx, xxxxxxxxxxxx xxxxxxxxxxxx "xxxx"xxxxxxxx"

所以上面的行会被转换成这个(双引号转换成单引号):

sms;deliver;"+99999999999";"";"";"2012.06.23 09:21";"";"xxxxxxxxxxxxx xxxxxxxx, xxxxxxxxxxxx xxxxxxxxxxxx 'xxxx'xxxxxxxx"

【问题讨论】:

  • @nachito 如果以某些特定的正则表达式开头,我完全不知道如何将行移到上一行。

标签: sed grep tr


【解决方案1】:

以下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; 不在一行时才将" 更改为'

【讨论】:

  • 我只需要将内容部分中的双引号转换为单引号。 +1 解释
【解决方案2】:

这可能对你有用:

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'"

【讨论】:

  • @kedar 看到编辑,虽然也许我不明白你的要求?
  • 问题已解决,(xx 只是任意数量文本的示例)
猜你喜欢
  • 2018-03-08
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多