尋找一行中的部分文本,然後將其新增至同一行的另一部分

尋找一行中的部分文本,然後將其新增至同一行的另一部分

我有這個:

Issue #12345: some more text here https://some.domain/some/path

我想找到 12345 位元(這是動態的 - 因此需要通過正則表達式),然後將其添加到同一行的末尾。就像這樣:

Issue #12345: some more text here https://some.domain/some/path/12345

我怎麼能使用 sed/awk 來實現這一點?

PS:我環顧四周,但唯一類似的問題是:用同一字串的另一部分替換字串的一部分……但它缺少正則表達式位。

答案1

假設您的輸入位於檔案 test.txt 中,則下列命令應該有效

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

如果您不直接從文件中讀取,

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

輸出:

Issue #12345: some more text here https://some.domain/some/path/12345

該命令的作用:

^(.*)從文件開頭開始,抓取所有內容,直到下一個匹配項 ([[:digit:]]{5})匹配接下來的 5 位數字, (.*)$抓取所有內容,直到文件末尾, \1\2\3\/\2每個匹配的組都編號(在本例中為1-3),然後我們格式化輸出以獲取原始文字(匹配 1-3),“/”,然後是第二個匹配。

如果您能更具體地描述您的問題,以供將來參考,那將是理想的選擇。例如,假設您正在尋找一行中的前 5 位數字,並希望將這些數字(帶有前面的斜線)新增至該行的末尾,並對輸入中的每一行都執行此操作。我以為這就是你的意思。如果沒有,您可能需要更新您的問題以使其更加具體。

您可能還想列出您所做的一些嘗試,而不僅僅是引用以前的問題。還可以幫助我們更好地了解您正在嘗試做什麼。

答案2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

或者,如果您sed必須-E處理模式中的擴充正規表示式,

sed -E 's,([[:digit:]]+).*,&/\1,' file

替換表達式sed找到該行上的第一個正整數(數字字串)並捕獲它。它還匹配從該點到該行末尾的該行的其餘部分。表達式的替換部分將行的匹配位替換為匹配的所有內容 ( &),然後是斜線和捕獲的數字字串。

我使用逗號作為表達式中的分隔符,因為替換部分包含斜杠,但我也可以將命令編寫為

sed -E 's/([[:digit:]]+).*/&\/\1/' file

上面的命令將對所有輸入行執行替換。若要將其限制為僅以字串開頭的行Issue #,請使用

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

答案3

我已經透過以下方法完成了

命令

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

輸出

Issue #12345: some more text here https://some.domain/some/path/12345

相關內容