Bash sed-仅替换1个实例并删除其余实例

Bash sed-仅替换1个实例并删除其余实例,bash,sed,Bash,Sed,我目前有下面的命令代码块,它将比较两个文本字符串,如果它们不相等,则替换为预期值。当实际字符串只有一个实例时,这种方法非常有效,但如何改进它,使其只替换第一个查找并删除其他查找 if [ "$actualString" != "$expectedString" ]; then sed -i 's|$actualString|$expectedString|g' /tmp/test fi 编辑:我将处理ssh密钥,因此$actualString将是一个密钥,或者在多次出现的情况下,在不同

我目前有下面的命令代码块,它将比较两个文本字符串,如果它们不相等,则替换为预期值。当实际字符串只有一个实例时,这种方法非常有效,但如何改进它,使其只替换第一个查找并删除其他查找

if [ "$actualString" != "$expectedString" ]; then
    sed -i 's|$actualString|$expectedString|g' /tmp/test
fi
编辑:我将处理ssh密钥,因此$actualString将是一个密钥,或者在多次出现的情况下,在不同的行上有多个密钥。例如:

key user1@host1
key user2@host2
key user1@host1
key user3@host3
key user1@host1
我只想替换第一个具有user1@host1和“猴子”user1@host1,并删除其余的。我正在寻找我的文件,以便更新

monkey user1@host1
key user2@host2
key user3@host3

使用
perl-0
可以一次吞下整个文件,这样做更容易:

perl -0pe "s|$actualString|$expectedString|; s|$actualString||g"

如果只想保存重复用户的第一次出现,请删除其余用户并添加monkey:

sort -u inputfile.txt | sed -e "0,/$(sort inputfile.txt | uniq -d)/s/^key /monkey /"
sed-i
代替
sed-e
就地编辑文件(或
sed-i.bak
就地编辑时在
inputfile.txt.bak
中创建原始文件的备份。)

输出:

$ sort -u dat/keys.txt | sed -e "0,/$(sort dat/keys.txt | uniq -d)/s/^key /monkey /"
monkey user1@host1
key user2@host2
key user3@host3

注意:这假定有一个重复的用户。对于其他重复项,需要保留
uniq-d
的结果数组。

考虑以下几点

key user1@host1
key user2@host2
key user1@host1
key user3@host3
key user1@host1
key user2@host2
key user3@host3
key user1@host1
key user1@host2
查找第一个出现的
键user1@host1
并对其进行更改,然后删除其余的重复项。请执行以下操作:

sed -e '0,/key user1@host1/s/key user1@host1/............../' -e '/key user1@host1/d' 'my_file'
输出

..............
key user2@host2
key user3@host3
key user2@host2
key user3@host3
key user1@host2

sed
命令中使用单引号意味着
$actualString
$expectedString
的值将不会展开。也许你应该更新你的问题。另外,您是在询问同一行上的多个实例,还是在不同行上出现的实例?根据请求进行更新。您是否按照建议尝试了我的perl命令?我尝试了。我如何让它更新实际的文件?有很多输出,但没有什么有用的