Bash 要替换或附加的脚本
Bash script to replace or append
我是 Bash 脚本编写的新手,我遇到了一些困难。我正在尝试更改配置文件的配置值。如果它找到一个现有值,我希望它更新它,但如果它不存在,我希望它附加它。这是我从各种在线教程和片段中获得的信息:
# FUNCTION TO MODIFY CONFIG BY APPEND OR REPLACE
# File
# Find
# Replace / Append
function replaceappend() {
grep -q '^'
sed -i 's/^.*//'
echo '' >>
}
replaceappend "/etc/test.conf" "Port 20" "Port 10"
然而,正如您想象的那样,这是行不通的。这似乎与它背后的逻辑有关,我不确定如何捕获 grep 的结果以便选择 sed 或 echo。
只需使用命令的 return 值并使用双引号而不是单引号:
if ! sed -i "//{s///;h};"'${x;/./{x;q0};x;q1}'
then
echo "" >>
fi
来源:Return code of sed for no match 用于 q 命令
这超出了我正常使用 sed 的范围,所以让我解释一下它是如何工作的,据我所知:
sed "//{s///;h};"'${x;/./{x;q0};x;q1}'
第一个 //
是一个地址 - 我们将在 {...}
中对任何匹配它的行执行命令。作为副产品,它还将模式 -space 设置为 </code>.</p>
<p>命令 <code>{s///;h}
表示用 </code> 替换 pattern-space 中的任何内容,然后将 pattern-space 保存在 "hold-space" , sed 中的一种缓冲区。</p>
<p>单引号后的 <code>$
是另一个地址 - 它表示在最后一行执行下一个命令。
命令 {x;/./{x;q0};x;q1}
表示:
x
= 交换 hold-space 和 pattern-space
/./
= 匹配任何内容的地址
{x;q0}
= 交换 hold-space 和 pattern-space - 如果成功(hold-space 中有东西)然后 q0 =以 0 状态退出(成功)
x;q1
= 交换 hold-space 和 pattern-space - 因为现在成功了(由于之前的 x)然后 q1=exit with 1 status (失败)
第一部分周围的双引号允许替换 </code> 和 <code>
。后面部分的单引号防止错误替换 $
.
有点复杂,但只要文件中有内容,它似乎就可以工作。一个空文件仍然会成功,因为你在最后一行没有得到任何匹配项。
老实说,在所有这些复杂的事情之后......除非你正在处理的文件真的很长,以至于双重传递真的很糟糕我可能会回到 grep
解决方案,比如这个:
if grep -q "^"
then
sed -i "s/^.*$//"
else
echo "" >>
fi
以后更容易理解和维护...
我是 Bash 脚本编写的新手,我遇到了一些困难。我正在尝试更改配置文件的配置值。如果它找到一个现有值,我希望它更新它,但如果它不存在,我希望它附加它。这是我从各种在线教程和片段中获得的信息:
# FUNCTION TO MODIFY CONFIG BY APPEND OR REPLACE
# File
# Find
# Replace / Append
function replaceappend() {
grep -q '^'
sed -i 's/^.*//'
echo '' >>
}
replaceappend "/etc/test.conf" "Port 20" "Port 10"
然而,正如您想象的那样,这是行不通的。这似乎与它背后的逻辑有关,我不确定如何捕获 grep 的结果以便选择 sed 或 echo。
只需使用命令的 return 值并使用双引号而不是单引号:
if ! sed -i "//{s///;h};"'${x;/./{x;q0};x;q1}'
then
echo "" >>
fi
来源:Return code of sed for no match 用于 q 命令
这超出了我正常使用 sed 的范围,所以让我解释一下它是如何工作的,据我所知:
sed "//{s///;h};"'${x;/./{x;q0};x;q1}'
第一个 //
是一个地址 - 我们将在 {...}
中对任何匹配它的行执行命令。作为副产品,它还将模式 -space 设置为 </code>.</p>
<p>命令 <code>{s///;h}
表示用 </code> 替换 pattern-space 中的任何内容,然后将 pattern-space 保存在 "hold-space" , sed 中的一种缓冲区。</p>
<p>单引号后的 <code>$
是另一个地址 - 它表示在最后一行执行下一个命令。
命令 {x;/./{x;q0};x;q1}
表示:
x
= 交换 hold-space 和 pattern-space/./
= 匹配任何内容的地址{x;q0}
= 交换 hold-space 和 pattern-space - 如果成功(hold-space 中有东西)然后 q0 =以 0 状态退出(成功)x;q1
= 交换 hold-space 和 pattern-space - 因为现在成功了(由于之前的 x)然后 q1=exit with 1 status (失败)
第一部分周围的双引号允许替换 </code> 和 <code>
。后面部分的单引号防止错误替换 $
.
有点复杂,但只要文件中有内容,它似乎就可以工作。一个空文件仍然会成功,因为你在最后一行没有得到任何匹配项。
老实说,在所有这些复杂的事情之后......除非你正在处理的文件真的很长,以至于双重传递真的很糟糕我可能会回到 grep
解决方案,比如这个:
if grep -q "^"
then
sed -i "s/^.*$//"
else
echo "" >>
fi
以后更容易理解和维护...