Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash中用sed命令替换符号间_Bash_Shell_Unix_Sed - Fatal编程技术网

如何在bash中用sed命令替换符号间

如何在bash中用sed命令替换符号间,bash,shell,unix,sed,Bash,Shell,Unix,Sed,因此,我最近请求了一个sed命令的帮助,以替换符号第一次和第二次出现之间的文本。这是指向该问题的链接: 现在我需要类似的东西,在第二个和第三个外观之间替换,第三个替换到行尾 假设我有这个文本文件: aaaa:bbbb:cccc:dddd eeee:ffff:gggg:hhhh iiii:jjjj:kkkk:llll 这一行所做的是在第一行和第二行之间进行替换:在给定的行中,问题是命令应该如何在第二行和第三行之间进行替换:,以及第三行到行的末尾 例如,第三行中第二行和第三行之间替换的输出如下所示

因此,我最近请求了一个sed命令的帮助,以替换符号第一次和第二次出现之间的文本。这是指向该问题的链接:

现在我需要类似的东西,在第二个和第三个外观之间替换,第三个替换到行尾

假设我有这个文本文件:

aaaa:bbbb:cccc:dddd
eeee:ffff:gggg:hhhh
iiii:jjjj:kkkk:llll
这一行所做的是在第一行和第二行之间进行替换:在给定的行中,问题是命令应该如何在第二行和第三行之间进行替换:,以及第三行到行的末尾

例如,第三行中第二行和第三行之间替换的输出如下所示:

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}/"
见:

s='aaaa:bbbb:cccc:dddd eeee:ffff:gggg:hhhh iiii:jjjj:KKK:lll' passwd='newpass' 行号=2 sed-E${lineNumber}s/^[^:::*:{2}[^:::*/\1${passwd}/您可以使用

sed -E "${lineNumber} s/^(([^:]*:){2})[^:]*/\1${passwd}/"
见:

s='aaaa:bbbb:cccc:dddd eeee:ffff:gggg:hhhh iiii:jjjj:KKK:lll' passwd='newpass' 行号=2
sed-E${lineNumber}s/^[^::::*:{2}[^::::*/\1${passwd}/您可以始终使用ruby,它可以完成sed/awk/grep可以完成和无法完成的任务,因此您不必随身携带不同的工具。在本例中,您可以使用:

ruby -pe '$_.sub!(/(:[^:]*:)([^:]*)/, "\\1XXX")'

这意味着要匹配[a]一个冒号、任何不包含冒号的冒号、另一个冒号和[b]任何不包含冒号的冒号,然后放回[a]\\1并用XXX替换[b],XXX应该是一个密码。

您可以始终使用ruby,它可以做sed/awk/grep可以做的事和他们不能做的事,所以你不必随身携带不同的工具。在本例中,您可以使用:

ruby -pe '$_.sub!(/(:[^:]*:)([^:]*)/, "\\1XXX")'

这意味着匹配[a]一个冒号、任何不包含冒号的冒号、另一个冒号和[b]任何不包含冒号的冒号,然后放回[a]\\1并用XXX替换[b],XXX应该是一个密码。

这可能适用于您的GNU:

sed ${lineNumber}'s/[^:]*/'${passwd}'/3' file

将第三次出现的非冒号替换为$lineNumber行上的变量$passwd。

这可能适用于GNU-sed:

sed ${lineNumber}'s/[^:]*/'${passwd}'/3' file

将第三次出现的非冒号替换为$lineNumber行中的变量$passwd。

您能解释一下为什么您没有接受上一个问题的任何答案吗?请您将问题中预期输出的示例发布在代码标签中,以使问题更清楚。上一个问题中给出的答案是有用且有效,但是现在我需要一个不同的命令来获得不同的输出。这是我在bash的第一年,所以我是一个初学者,不能很容易地修改代码。你能解释一下为什么你没有接受上一个问题的任何答案吗?你能不能在代码标签中发布你问题中预期输出的示例,以使问题更清楚。上一个问题中给出的答案很有用,也很有效,但现在我知道了需要一个不同的命令为不同的输出我正在寻找。这是我使用bash的第一年,所以我是初学者,不能很容易地修改代码。