我有一组文本文件,每个文件包含一个以下行的实例,其中“(MR#”是识别正确行的最佳方式...
Smith, John A (MR # MR123456)
我想获得三个sed语句,当针对给定文件运行时,填充以下三个变量:Plname,Pfname和MRnum。使用上面的示例,我希望变量在运行sed语句后最终保留以下内容。
Plname=Smith
Pfname=John
MRnum=MR123456
尽管有很多sed示例,但我是新手,并且目前正在努力使用确切的语法。谢谢你的帮助。
答案 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 #
#2
(s///
)用正则表达式替换其内容#3
(p
)打印结果#4
(q
)停止处理文件,因为我们已经找到了我们要找的内容