如何使用sed仅替换单引号内字符串中的指定子串?
用sed实现仅替换单引号内的指定子串
我来给你分享一个精准解决需求的sed方案:只替换单引号包裹内容里的目标子串(比如把YouTube换成you_tube),单引号外的内容完全不动,甚至能处理单引号内有多个目标子串的情况。
核心命令
直接用这条命令就可以搞定(把input.txt换成你的目标文件名,或者用管道传递输入):
sed -E " :loop s/'([^']*?)YouTube([^']*)'/'\1you_tube\2'/ t loop " input.txt
命令逻辑拆解
:loop:先定义一个循环标签,方便后续重复执行替换操作s/'([^']*?)YouTube([^']*)'/'\1you_tube\2'/:- 正则部分
'([^']*?)YouTube([^']*)'专门匹配单引号内包含YouTube的片段,[^']*?是非贪婪匹配,确保不会跨多个单引号对(比如不会把'a' 'b'当成一个整体) - 替换时保留单引号内的其他内容,只把捕获到的
YouTube换成you_tube
- 正则部分
t loop:如果上一次替换成功了,就跳回loop标签继续循环,直到单引号内再也找不到YouTube为止
实际效果示例
原文本:
This is a YouTube video referenced by the 'movies.YouTube_id' column and 'YouTube.channel' too.
执行命令后输出:
This is a YouTube video referenced by the 'movies.you_tube_id' column and 'you_tube.channel' too.
你看,单引号外的YouTube完全没动,只有单引号里的目标子串被精准替换了。
内容的提问来源于stack exchange,提问作者Alessandro Maselli
相关产品推荐
相关产品推荐

