簡體   English   中英

如何在bash中用sed命令替換符號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM