2017-07-18 74 views
0

我必須替換文件中兩個字符串之間的所有內容,但僅限於第二個字符串的第一次出現。如何替換之間的一切,但只有直到第一次出現結束字符串?

以下是文件內容的樣本線,

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

貪婪問題可以在這種特殊情況下可避免加入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/' 
+1

感謝您的回答。您的'sed'註釋對我來說很神祕,因爲這將在docker容器內運行,我們無法確定perl的安裝情況。你是否也可以添加你的'sed'解決方案與這個答案?所以我可以接受。 – Stranger

相關問題