sed:仅当用引号括起来时才替换文本中的字符串

时间:2018-02-13 18:07:46

标签: bash sed

只有当特定的字符序列属于引号中包含的字符串时,才需要使用sed替换文本中的字符序列。

e.g。以下文字:

  

这是由电影引用的YouTube视频.YouTube_id'列。

应该像这样转换:

  

这是由电影引用的YouTube视频.you_tube_id'列。

即。替换子串" YouTube"用" you_tube"只有当这样的子字符串是用单引号(')括起来的字符串的一部分时,无论引号中包含的前导和/或尾随字符如何。

显然

sed -r "s/YouTube/you_tube/g"

不起作用,因为它取代了" YouTube"用" you_tube"无论报价如何,无处不在。我可以使用哪个正则表达式来完成任务?

提前谢谢。

4 个答案:

答案 0 :(得分:2)

使用GNU sed:

sed -E "s/('[^']*)YouTube([^']*')/\1you_tube\2/g" file

输出:

This is a YouTube video referenced by the 'movies.you_tube_id' column.

答案 1 :(得分:1)

关注awk可能对您有所帮助:

awk '{sub(/\047movies.YouTube_id\047/,"\047movies.you_tube_id\047")} 1'   Input_file

输出如下:

This is a YouTube video referenced by the 'movies.you_tube_id' column.

答案 2 :(得分:1)

以下是awk解决方案:

awk 'BEGIN{FS=OFS="\047"} {
for (i=2; i<=NF; i+=2) gsub(/YouTube/, "you_tube", $i)} 1' file

This is a YouTube video referenced by the 'movies.you_tube_id' column.

Sinec我们使用单引号作为字段分隔符,每个偶数字段将为我们提供由单引号包围的引用字符串。

答案 3 :(得分:0)

如果字符串未修复(不一样),则使用环顾高级正则表达式和

perl -pe "s/(?<=')(:?\w+\.)?YouTube(?=_id')/you_tube/"