【问题标题】:Performing regex capture and then substitute using SED/PERL执行正则表达式捕获,然后使用 SED/PERL 替换
【发布时间】:2013-07-31 14:37:03
【问题描述】:

我有一个看起来像这样的数据(我们称这个文件为submit.txt):

dir1/pmid_5409464.txt
dir1/pmid_5788247.txt
dir1/pmid_4971884.txt

我想做的是执行内联文件正则表达式更改 从而导致以下结果

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl/home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

是否有 SED/Perl one liner 可以做到这一点?

我的困难在于捕获输入文件名,然后 为每一行创建输出文件 (.output) - 基于此。我被这个困住了:

sed 's/^/perl mycode.pl \/home\/neversaint\/dir1\//g' submit.txt |
sed 's/$/ >/'

【问题讨论】:

  • awk '{print "xxx/x/y/"$0 "> xxxxxxxx/$0}' list > output?祝你好运。
  • 不,那不行。关键是每一行都从pmid_xxx.txt 捕获pmid_xxx 并为每一行打印该pmid_xxx.output 的输出版本。

标签: regex perl sed


【解决方案1】:

您可以使用转义括号来捕获组,并使用 \1、\2 等访问组。

sed 's/^\(.*\).txt$/perl mycode.pl \/home\/neversaint\/\1\.txt > \/home\/neversaint\/\1.output/' submit.sh

输出:

perl mycode.pl /home/neversaint/dir1/pmid_5409464.txt > /home/neversaint/dir1/pmid_5409464.output
perl mycode.pl /home/neversaint/dir1/pmid_5788247.txt > /home/neversaint/dir1/pmid_5788247.output
perl mycode.pl /home/neversaint/dir1/pmid_4971884.txt > /home/neversaint/dir1/pmid_4971884.output

edit:看起来 sed 没有内置的文件编辑功能(GNU sed 有 -i 选项)。它仍然可以做到,但这个解决方案只是打印到标准输出。你也可以使用 Perl one liner,如下所示:sed edit file in place

【讨论】:

  • 非常感谢。顺便说一句,有没有办法可以将您的代码分成多行;后来我意识到,在我的编辑器中这样阅读更容易。
  • 不客气!您可以使用 shell 变量将其拆分,类似于:stackoverflow.com/questions/8078872/…。基本上将搜索字符串存储在一个变量中,并在另一个变量中替换字符串。我不知道这是否会有很大帮助,因为替换字符串仍然很长。您还可以将搜索和替换部分放在一个文件中,并使用 sed -f 选项调用它
【解决方案2】:

你要了一个 Sed 单行,你明白了。

sed 's/\([^.]*\)\.txt/perl mycode.pl \/home\/neversaint\/\1.txt > \/home\/neversaint\/\1.output/' submit.txt > output.txt

【讨论】:

  • 当字符串中有很多斜杠时(例如文件名),使用另一个分隔符,而不是 /。 Sed 也适用于 _, |或:。
【解决方案3】:

做同样事情的 perl oneliner 是

perl -pe "s@(.*?)(\.txt)@perl mycode.pl /home/neversaint/\\1\\2 > /home/neversaint/\\1.output@g" submit.txt

上述命令将在控制台中生成一个替换的字符串,您必须将输出重定向到另一个文件。

要在文件中替换(内联替换),您可以添加 -i 选项。 例如

perl -pe "s@(.*?)(.txt)@perl mycode.pl /home/neversaint/\1\2 > /home/neversaint/\1.output@g" -i submit.txt

上面将在 submit.txt 文件本身内执行替换。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2021-11-14
    • 2021-12-31
    • 2017-12-31
    相关资源
    最近更新 更多