如何替换之间的所有内容,但直到第一次出现结束字符串?

时间:2017-07-18 13:44:32

标签: string sed

我必须替换文件中两个字符串之间的所有内容,但直到第一次出现第二个字符串为止。

以下是文件内容的示例行

AuthorSessionId
, CONVERT_TZ(CreatedAt,"${DatabaseTimezone}","${ApplicationTimezone}") AS CreatedAt
FROM PlayerPhoneArchive 
WHERE RevisionDate BETWEEN ? AND ?

) AS PH 


在此,我希望将所有内容从CONVERT_TZ替换为
的第一个CreatedAt


最终输出应为,

AuthorSessionId
, CreatedAt
FROM PlayerPhoneArchive 
WHERE RevisionDate BETWEEN ? AND ?

) AS PH 


这是我尝试过的,

sed -e 's/CONVERT_TZ.*
&#xa/CreatedAt\
\&#xa/

但它正在替换
&#xa的最后一次出现,即字符串的结尾,然后出现,

AuthorSessionId
, CreatedAt


因为它正在替换,直到最后一次出现


如何在第一次出现字符串
之前进行替换?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在此特定情况下,可以通过向搜索字词

添加CreatedAt来避免贪婪问题
sed 's/CONVERT_TZ.*CreatedAt
&#xa/CreatedAt\
\&#xa/'
# or use back-reference to re-use strings
sed 's/CONVERT_TZ.*\(CreatedAt
&#xa\)/\1/'


通常,如果命令使用的正则表达式支持它,则可以使用非贪婪 .*?

perl -pe 's/CONVERT_TZ.*?
&#xa/CreatedAt
&#xa/'
# or lookahead to avoid repeating '
&#xa'
perl -pe 's/CONVERT_TZ.*?(?=
&#xa)/CreatedAt/'