使用sed复制行并从重复项中删除字符

时间:2011-09-10 01:29:47

标签: regex sed

我有一个看起来像这样的文件:

@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",

我希望它看起来像这样

@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",

我以为我可以使用sed来做这个但是我无法弄清楚如何在缓冲区中存储某些内容然后修改它。

我甚至使用合适的工具吗?

由于

5 个答案:

答案 0 :(得分:16)

您不必使用正则表达式和替换字符串变得棘手:使用sed的p命令完整地打印该行,然后修改该行并让它隐式打印

sed 'p; s/\.png//'

答案 1 :(得分:11)

使用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),然后是字符串",

这只是命令的简要说明。希望这可以帮助。另请注意,您可以使用\n字符串来表示某些sed版本中的换行符(例如GNU sed)。它将呈现更简洁和可读的命令:

sed 's/@"\([^.]*\)\.png",/&\n@"\1",/' input 

答案 2 :(得分:10)

格伦杰克曼的回答是好的,但它也使那些与表达不符的行加倍。

相反,这个只加倍与表达式匹配的行:

sed -n 'p; s/\.png//p'

这里,-n代表“除非明确打印否则不打印”,如果替换完成,s/\.png//p中的p强制打印,否则不强制打印

答案 3 :(得分:8)

我比Carles Sala和Glenn Jackman更喜欢这个:

sed '/.png/p;s/.png//'

可以说这是个人偏好。

答案 4 :(得分:0)

或者可以组合两个版本并仅在匹配所需模式的行上应用复制

sed -e '/^@".*\.png",/{p;s/\.png//;}' input