Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed,识别文本文件中的右行,并将三个不同部分写入单独的变量_Regex_Linux_Sed_Text Processing - Fatal编程技术网

Regex 使用sed,识别文本文件中的右行,并将三个不同部分写入单独的变量

Regex 使用sed,识别文本文件中的右行,并将三个不同部分写入单独的变量,regex,linux,sed,text-processing,Regex,Linux,Sed,Text Processing,我有一组文本文件,每个文件都包含以下行的一个实例,其中MR是识别正确行的最佳方法 Smith, John A (MR # MR123456) 我想得到三个sed语句,当对给定文件运行时,它们填充以下三个变量:Plname、Pfname和MRnum。使用上面的示例,我希望变量在运行sed语句后能够保存以下内容 Plname=Smith Pfname=John MRnum=MR123456 尽管有很多sed示例,但我对这一点还不熟悉,目前正在为精确的语法而挣扎。谢谢你的帮助。类似这样的内容: $

我有一组文本文件,每个文件都包含以下行的一个实例,其中MR是识别正确行的最佳方法

Smith, John A (MR # MR123456)
我想得到三个sed语句,当对给定文件运行时,它们填充以下三个变量:Plname、Pfname和MRnum。使用上面的示例,我希望变量在运行sed语句后能够保存以下内容

Plname=Smith
Pfname=John
MRnum=MR123456
尽管有很多sed示例,但我对这一点还不熟悉,目前正在为精确的语法而挣扎。谢谢你的帮助。

类似这样的内容:

$ 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、 三, 问题4 }

sed将逐行解析文件 -n flag表示sed不会在默认情况下打印每一行,因为如果需要,我们将手动执行此操作 1//查找包含MR的行 如果行匹配,我们将执行以下操作: 2 s///用正则表达式替换其内容 3页打印结果 4Q停止处理文件,因为我们已经找到了要查找的内容
到目前为止,您有什么发现?如果我知道所讨论的行恰好是文件的第一行(通常是这样),那么我可以使用以下方法获得Plname。但我不能假设它总是第一行。sed-n'1 s/,.*//p'$VAR\u CURRENT\u filename这是一个很大的帮助,我非常感谢。如果我只想得到John而不是:John A作为Pfname,我会怎么做?您需要更改regexp:sed-n'/MR/{s/^[^,]\+,[]\?\[^]\+\.*/\1/p;q}'实际上我只更改了其中的一个符号。顺便问一下,如果我的回答有用,为什么我们不接受或投票支持它呢这太棒了。非常感谢。