使用 sed 命令来
Using sed command to
我正在尝试能够读取文件、替换变量或将其添加到底部(如果尚未指定)。
我得到了一点帮助才能走到这一步:
#!/bin/bash
function replaceappend() {
if ! sed "//{s///;h};"'${x;/./{x;q0};x;q1}'
then
echo "" >>
fi
}
replaceappend "/etc/ssh/sshd_config" "Port 22" "Port 123"
然而,在 运行 这个脚本之后,原始文件的内容似乎没有受到影响,并且保留在端口 22 上,没有任何附加内容。
在此示例中,它使用 q 标志在 sed 上使用指定的退出代码以查看它是否找到它,如果没有则附加它。
谁能看出为什么这段代码可能不起作用?
我认为这就是你想要做的:
$ cat tst.sh
function replaceappend() {
awk -v old="" -v new="" '
sub(old,new) { replaced=1 }
{ print }
END { if (!replaced) print new }
' "" > /usr/tmp/tmp$$ &&
mv /usr/tmp/tmp$$ ""
}
replaceappend file "Port 22" "Port 123"
replaceappend file "Port 22" "Port 123"
$ cat file
line 1
Port 22
line 3
Port 71
line 5
$ ./tst.sh
$ cat file
line 1
Port 123
line 3
Port 71
line 5
Port 123
这可能对你有用(GNU sed & bash):
function replaceappend() {
sed '/'""'/{s//'""'/;h};$!b;x;/./{x;b};x;a'""
}
该函数使用原始的 sed 语句,但它没有在文件末尾返回退出代码,而是检查保持 space(它已被用作标志以标记是否发生了替换) 并且在替换已经发生时不执行任何操作,或者在替换失败时将所需的字符串附加到文件末尾。
我正在尝试能够读取文件、替换变量或将其添加到底部(如果尚未指定)。
我得到了一点帮助才能走到这一步:
#!/bin/bash
function replaceappend() {
if ! sed "//{s///;h};"'${x;/./{x;q0};x;q1}'
then
echo "" >>
fi
}
replaceappend "/etc/ssh/sshd_config" "Port 22" "Port 123"
然而,在 运行 这个脚本之后,原始文件的内容似乎没有受到影响,并且保留在端口 22 上,没有任何附加内容。
在此示例中,它使用 q 标志在 sed 上使用指定的退出代码以查看它是否找到它,如果没有则附加它。
谁能看出为什么这段代码可能不起作用?
我认为这就是你想要做的:
$ cat tst.sh
function replaceappend() {
awk -v old="" -v new="" '
sub(old,new) { replaced=1 }
{ print }
END { if (!replaced) print new }
' "" > /usr/tmp/tmp$$ &&
mv /usr/tmp/tmp$$ ""
}
replaceappend file "Port 22" "Port 123"
replaceappend file "Port 22" "Port 123"
$ cat file
line 1
Port 22
line 3
Port 71
line 5
$ ./tst.sh
$ cat file
line 1
Port 123
line 3
Port 71
line 5
Port 123
这可能对你有用(GNU sed & bash):
function replaceappend() {
sed '/'""'/{s//'""'/;h};$!b;x;/./{x;b};x;a'""
}
该函数使用原始的 sed 语句,但它没有在文件末尾返回退出代码,而是检查保持 space(它已被用作标志以标记是否发生了替换) 并且在替换已经发生时不执行任何操作,或者在替换失败时将所需的字符串附加到文件末尾。