我有一个如下所示的文件:
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",我想让它看起来像这样
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",我认为我可以使用sed来做这件事,但我不知道如何在缓冲区中存储内容,然后对其进行修改。
我是否使用了正确的工具?
谢谢
发布于 2011-09-10 09:41:04
使用sed很容易做到这一点,您甚至不需要使用保留空间( sed辅助缓冲区)。给定下面的input文件:
$ cat input
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",您应该使用以下命令:
sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input 结果是:
$ sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",此命令只是一个替换命令(s///)。它匹配所有以@"开头、非句点字符([^.]*)和.png",开头的字符。此外,它使用组方括号\(和\)匹配.png",之前的所有非句点字符,因此我们可以获得该组匹配的字符。因此,这是要替换的正则表达式:
@"\([^.]*\)\.png",所以跟在命令的替换部分之后。&命令只是在更改后的内容中插入与@"\([^.]*\)\.png",匹配的所有内容。如果它是替换部件的唯一元素,则不会更改输出中的任何内容。但是,&后面有一个换行符-由反斜杠\表示,后面跟一个实际的换行符-在新行中,我们添加@"字符串,后跟第一个组(\1)的内容,然后是字符串",。
这只是对该命令的简要说明。希望这能有所帮助。还要注意,在某些版本的sed (比如GNU )中,您可以使用\n字符串来表示换行符。它将呈现一个更简洁、更易读的命令:
sed 's/@"\([^.]*\)\.png",/&\n@"\1",/' input 发布于 2011-09-10 09:47:42
您不必使用正则表达式和替换字符串:使用sed的p命令完整地打印该行,然后修改该行并让其隐式打印
sed 'p; s/\.png//'发布于 2014-01-30 20:10:10
Glenn jackman的响应是OK,但它也会将不匹配表达式的行数加倍。
相反,这个表达式只将匹配该表达式的行数加倍:
sed -n 'p; s/\.png//p'在这里,-n代表“除非显式打印,否则什么都不打印”,如果进行了替换,则s/\.png//p中的p强制打印,否则不强制打印
https://stackoverflow.com/questions/7369047
复制相似问题