我必须替换文件中两个字符串之间的所有内容,但直到第一次出现第二个字符串为止。
以下是文件内容的示例行
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.*
/CreatedAt\
\
/
但它正在替换

的最后一次出现,即字符串的结尾,然后出现,
AuthorSessionId
, CreatedAt

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

。
如何在第一次出现字符串

之前进行替换?非常感谢任何帮助。
答案 0 :(得分:1)
在此特定情况下,可以通过向搜索字词
添加CreatedAt
来避免贪婪问题
sed 's/CONVERT_TZ.*CreatedAt
/CreatedAt\
\
/'
# or use back-reference to re-use strings
sed 's/CONVERT_TZ.*\(CreatedAt
\)/\1/'
通常,如果命令使用的正则表达式支持它,则可以使用非贪婪 .*?
perl -pe 's/CONVERT_TZ.*?
/CreatedAt
/'
# or lookahead to avoid repeating '
'
perl -pe 's/CONVERT_TZ.*?(?=
)/CreatedAt/'