我有這個:
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