使用sed,在文本文件中标识正确的行,并将三个不同的部分写入单独的变量

时间:2014-08-14 14:11:10

标签: regex linux sed text-processing

我有一组文本文件,每个文件包含一个以下行的实例,其中“(MR#”是识别正确行的最佳方式...

Smith, John A (MR # MR123456)

我想获得三个sed语句,当针对给定文件运行时,填充以下三个变量:Plname,Pfname和MRnum。使用上面的示例,我希望变量在运行sed语句后最终保留以下内容。

Plname=Smith
Pfname=John
MRnum=MR123456

尽管有很多sed示例,但我是新手,并且目前正在努力使用确切的语法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这样的事情:

$ cat t
bla-bla-bla
Smith, John A (MR # MR123456)
bla-bla-bla
$ Plname="$(sed -n '/(MR #/{s/^\([^,]\+\),.*/\1/p;q}' t)"
$ Pfname="$(sed -n '/(MR #/{s/^[^,]\+,[ ]\?\([^(]\+\).*/\1/p;q}' t)"
$ MRnum="$(sed -n '/(MR #/{s/^[^(]\+(MR # \([^)]\+\).*/\1/p;q}' t)"
$ printf "Plname = %s, Pfname = %s, MRnum = %s\n" "$Plname" "$Pfname" "$MRnum"
Plname = Smith, Pfname = John A , MRnum = MR123456

小解释:

/(MR #/{s/^\([^,]\+\),.*/\1/p;q}

的简短形式

/(MR #/ #1 { s/^\([^,]\+\),.*/\1/; #2 p; #3 q #4 }

  • sed将逐行解析文件
  • -n标志表示sed不会打印每一行(默认情况下会这样做),因为我们会在需要时手动执行此操作
  • #1//)找到包含(MR #
  • 的行
  • 如果行匹配,那么我们会执行以下操作:
    • #2s///)用正则表达式替换其内容
    • #3p)打印结果
    • #4q)停止处理文件,因为我们已经找到了我们要找的内容