2

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

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 中寻找一个命令,使用它我可以在每一行中搜索一个模式并将其附加到该行的末尾。可能吗?

提前致谢。

4

2 回答 2

4

维姆

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

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

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

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

sed

尽管正则表达式的语法与 Vim 中的有些不同,但相同的表达式可以用于sed:

sed -e 's/\([^/]*\.csv\)\( .*\)/&\1.org/' input

备择方案

看起来您想批量进行文件重命名。在 Linux 上,mmv 命令行工具非常适合。您可能还会在网络上找到许多类似的工具。

于 2013-06-13T07:25:32.073 回答
2

这可能对您有用(GNU sed):

sed -r 's|/([^ ]*) .*|&\1.org|' file
于 2013-06-13T09:37:11.733 回答