我寫了這段代碼,從一個檔案中提取軟體的版本,并在另一個檔案中覆寫它:
newVersion=$(sed -r -n 's/<version>(.*-SNAPSHOT)</version>/1/p' sa-pom.xml)
找到 ./pom.xml -type f -exec sed -r -i -e "s/< version> (. *-SNAPSHOT)</version>/<version>${newVersion}</version>/g" {} 。
echo '<version>'$newVersion'</version> '
... 它可以作業,但在支持變數中放了1個空格,在目標檔案中放了3個空格,分別產生了以下輸出:
<version> 0. 19.6-SNAPSHOT</version> 0.
<version>/span> 0. 19.6-SNAPSHOT</version> 0.
... 這是sa-pom.xml檔案的一個剪切版本:
<project xmlns="http://maven.apache.org/POM/4.0. 0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>/span>4.0.0</modelVersion>/span>
<groupId>my-group-id</groupId>
<artifactId>my-artifact-id</artifactId>
<version>0.19.9-SNAPSHOT</version>/span>
<packaging>jar</packaging>
<name>我的專案名稱</name>
</project>/span>
... 這是pom.xml的剪切版本
<project xmlns="http://maven.apache.org/POM/4.0. 0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>/span>4.0.0</modelVersion>/span>
<parent>/span>
<groupId>my-group-id</groupId>
<artifactId>my-parent-artifact-id</artifactId>
<version>/span>${revision}</version>/span>
</parent>/span>
<artifactId>my-artifact-id</artifactId>
<version>0.19.8-SNAPSHOT</version>/span>
<packaging>jar</packaging>
<name>我的專案名稱</name>
</project>/span>
... 如何解決這個問題?
uj5u.com熱心網友回復:
sed在這里并沒有真正的添加任何空格,但是它捕獲了任何已經存在的空格,并在替換中保留它們。 但是,因此,只要擴展你的搜索結果,以避免捕獲任何空格。
newVersion=$(sed -n -r 's%.*<version>[[:space:]]*(.*-SNAPSHOT)</version> .*%1%p'/span> sa-pom.xml)
sed -r -i "s%<version>[[:space:]]*(.*-SNAPSHOT)</version>%<version>${newVersion}</version>%" /span> pom.xml
echo "<version>$newVersion</version>"/span>
在<version>前添加.*,可以洗掉該行的前導空格(以及<version>標簽前的任何其他文本)。我還在</version>后面添加了.*,以修剪掉關閉標簽后的任何文本,只是為了保持這種穩健。
在捕獲前添加[[:space:]]*可以確保捕獲的運算式中不包含空格,因為重構引擎將盡可能地跳過許多空格,并且不需要從那里回溯以獲得一個匹配(如果它回溯,那是因為它根本找不到一個匹配)。
如果這聽起來太復雜,讓我們更廣泛地說明,鉸鏈引擎更傾向于最左邊的匹配,所以匹配捕捉組之外的空格,使它們不在其中。
find在這里似乎也是完全多余的。
你會注意到,我也改變了s%...%...%的分隔符,以避免反斜線重現。 /g標志似乎也是不必要的(除非你真的期望每行有多個匹配,但那時你不能在搜索中使用.*,因為它將吃掉第一個匹配和最后一個匹配之間的所有文本)。如果你的腳本只有一個字串(而且不是以破折號開始),那么-e就不是很必要。最后,我修正了echo中的引號。
這仍然是相當脆弱的;理想情況下,請使用一個XML感知工具來決議XML檔案中的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318123.html
標籤:
上一篇:為什么換行符會破壞ANSI游標?
下一篇:中斷和例外-與編程語言的關系
