[英]How to replace between symbols with sed command in bash
所以我最近請求幫助使用 sed 命令來替換符號第一次和第二次出現之間的文本。 這是該問題的鏈接: 如何替換符號首次出現和第二次出現之間特定行中的文本
現在我需要類似的東西,在第二次和第三次出現之間替換,第三次到行尾
假設我有這個文本文件:
aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll
sed "${lineNumber}s/:[^:]*/:${passwd}/" users.txt
該行的作用是在給定行中的第一個和第二個“:”之間進行替換,因此問題是命令應該如何在第二個和第三個“:”之間以及第三個到行尾之間進行替換。
因此,例如,在第三行中用“####”替換第二行和第三行的輸出將如下所示:
aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:####
和代碼
sed "${lineNumber}s/:[^:]*/:${passwd}/" users.txt
^^^^^^ I think that is what should be replaced
您可以使用
sed -E "${lineNumber} s/^(([^:]*:){2})[^:]*/\1${passwd}/"
請參閱在線sed
演示:
s='aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll'
passwd='newpass'
lineNumber=2
sed -E "${lineNumber} s/^(([^:]*:){2})[^:]*/\1${passwd}/" <<< "$s"
輸出(參見第二行第二個和第三個冒號之間的文本):
aaaa:bbbb:cccc:dddd
eeee:ffff:newpass:hhhh
iiii:jjjj:kkkk:llll
細節
^
- 字符串的開始(([^:]*:){2})
- 第 1 組(此值使用正則表達式替換模式中的\\1
占位符引用):出現兩次除:
之外的任何字符,然后是:
[^:]*
- 除:
之外的零個或多個字符。 請注意, {2}
是一個范圍量詞,它匹配其修改后的模式指定的次數。 如果將其更改為{3}
,它將在第三次出現:
char 后替換。
這可能對你有用(GNU sed):
sed ${lineNumber}'s/[^:]*/'${passwd}'/3' file
在編號為$lineNumber
的行上用變量$passwd
替換第三次出現的非冒號。
您始終可以使用 ruby,它可以做 sed/awk/grep 可以做的和它們不能做的事情,因此您不必隨身攜帶不同的工具。 在本例中,您可以使用:
ruby -pe '$_.sub!(/(:[^:]*:)([^:]*)/, "\\1XXX")'
這意味着匹配 [a] “一個冒號,任何不包含冒號的東西,另一個冒號”和 [b]“任何不包含冒號的東西”,然后放回 [a] (\\\\1) 並將 [b] 替換為 XXX這應該是一個密碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.