我有一个看起来像这样的文件:
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",
Run Code Online (Sandbox Code Playgroud)
我以为我可以使用sed来做这个但我无法弄清楚如何将某些东西存储在缓冲区然后修改它.
我甚至使用合适的工具吗?
谢谢
gle*_*man 16
您不必使用正则表达式和替换字符串变得棘手:使用sed的p命令完整地打印该行,然后修改该行并让它隐式打印
sed 'p; s/\.png//'
Run Code Online (Sandbox Code Playgroud)
bra*_*zzi 11
使用sed非常容易,甚至不需要使用保持空间(sed辅助缓冲区).鉴于以下input文件:
$ cat input
@"Afghanistan.png",
@"Albania.png",
@"Algeria.png",
@"American_Samoa.png",
Run Code Online (Sandbox Code Playgroud)
你应该使用这个命令:
sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input
Run Code Online (Sandbox Code Playgroud)
结果:
$ sed 's/@"\([^.]*\)\.png",/&\
@"\1",/' input
@"Afghanistan.png",
@"Afghanistan",
@"Albania.png",
@"Albania",
@"Algeria.png",
@"Algeria",
@"American_Samoa.png",
@"American_Samoa",
Run Code Online (Sandbox Code Playgroud)
这个命令只是一个替换命令(s///).它匹配任何开头,@"后跟非周期字符([^.]*),然后匹配.png",.此外,所有非周期匹配字符前.png",使用组支架\( 和\),所以我们可以得到什么是由该组匹配.所以,这是要替换的正则表达式:
@"\([^.]*\)\.png",
Run Code Online (Sandbox Code Playgroud)
因此遵循命令的替换部分.该&命令只插入已@"\([^.]*\)\.png",更改内容中匹配的所有内容.如果它是替换部件的唯一元件,则输出中不会有任何改变.但是,在后面&有一个换行符 - 由反斜杠\后跟一个实际换行符表示 - 在新行中我们添加@"字符串,后跟第一个组(\1)的内容,然后是字符串",.
这只是命令的简要说明.希望这可以帮助.另请注意,您可以使用该\n字符串来表示某些sed版本中的换行符(例如GNU sed).它将呈现更简洁和可读的命令:
sed 's/@"\([^.]*\)\.png",/&\n@"\1",/' input
Run Code Online (Sandbox Code Playgroud)
Car*_*ala 10
格伦杰克曼的回答是可以的,但它也使那些与表达不符的行加倍.
相反,这个只加倍与表达式匹配的行:
sed -n 'p; s/\.png//p'
Run Code Online (Sandbox Code Playgroud)
这里,-n代表"除非明确打印否则不打印",s/\.png//p如果替换完成则p 强制打印,否则不强制它
我比Carles Sala和Glenn Jackman更喜欢这个:
sed '/.png/p;s/.png//'
Run Code Online (Sandbox Code Playgroud)
可以说这是个人喜好.