搜索每一行中的模式并将其附加到该行的末尾

时间:2013-06-13 07:07:27

标签: bash vim sed

我有一个包含以下条目的文件:

folder1/a_b.csv folder1/generated/
folder2/folder3/a_b1.csv folder12/generated/
folder4/b_c.csv folder123/generated/
folder5/d.csv folder1/new_folder/generated/
folder6/12.csv folder/anotherfolder/morefolder/evenmorefolder/generated/

我想从每一行复制csv文件名,将它们粘贴在该行的末尾,并用“.org”附加它。因此,更改的文件看起来像

folder1/a_b.csv folder1/generated/a_b.csv.org
folder2/folder3/a_b1.csv folder12/generated/a_b1.csv.org
folder4/b_c.csv folder123/generated/b_c.csv.org
folder5/d.csv folder1/new_folder/generated/d.csv.org
folder6/12.csv folder/anotherfolder/morefolder/evenmorefolder/generated/12.csv.org

基本上,我正在寻找vim或sed中的命令,我可以搜索每行中的模式并将其附加到该行的末尾。有可能吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

的Vim

以下是在Vim中执行此操作的方法:

:%s/\([^/]*\.csv\)\( .*\)/&\1.org/

此全局(:%替换匹配文件名(不包含/的字符,以.csv结尾),并捕获{{1它。然后它匹配线的其余部分,并捕获它。

作为替代品,首先保留原始匹配\(...\)(或&),然后在第一个捕获(\0)附加附加后缀。

SED

虽然正则表达式语法与Vim略有不同,但相同的表达式可以与\1一起使用:

sed

替代

看起来您想要批量进行文件重命名。在Linux上,mmv command-line tool非常适合这种情况;你也可能在网上找到很多类似的工具。

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed -r 's|/([^ ]*) .*|&\1.org|' file