如何创建bash函数来替换行或追加到文件

如何创建bash函数来替换行或追加到文件,bash,function,awk,sed,grep,Bash,Function,Awk,Sed,Grep,是否有一种更简单的方法来执行以下操作?如果文本存在,可能只需一个命令即可替换该文本,如果不存在,则可将文本附加到文件中。我需要对各种文件执行此操作,并希望找到一种方法将其放入函数中。行格式在两种情况下略有不同,我在下面举了两个例子 #If grep exists then sed line, else echo to end of file grep -q '^sometext' /file1.txt && sed -i "" "s/^sometext.*/sometext $n

是否有一种更简单的方法来执行以下操作?如果文本存在,可能只需一个命令即可替换该文本,如果不存在,则可将文本附加到文件中。我需要对各种文件执行此操作,并希望找到一种方法将其放入函数中。行格式在两种情况下略有不同,我在下面举了两个例子

#If grep exists then sed line, else echo to end of file
grep -q '^sometext' /file1.txt && sed -i "" "s/^sometext.*/sometext $newvar/" /file1.txt || echo "sometext $newvar" >> /file1.txt
grep -q '^someothertext' /file2.txt && sed -i "" "s/^someothertext.*/someothertext=$othernewvar/" /file1.txt || echo "someothertext=$othernewvar" >> /file1.txt

每当你发现自己使用GRP+SED或多个SEDS或各种其他工具组合来操纵文本时,现在只需简单地使用AWK来考虑:

awk -v key="sometext" -v sep=" " -v new="$newvar" '
sub("^"key".*",key sep new) { f=1 }
{ print }
END { if (!f) print key sep new }
' file

awk -v key="someothertext" -v sep="=" -v new="$othernewvar" '
sub("^"key".*",key sep new) { f=1 }
{ print }
END { if (!f) print key sep new }
' file
请注意,上面使用的regexp和支持反向引用的替换字符串与sed一样,因此您必须担心转义键和新文本中的元字符(
*
+
&
,等等。-请参阅)。但是,由于您使用的是awk,因此可以改用文字字符串:

awk -v key="sometext" -v sep=" " -v new="$newvar" '
index(key)==1 { $0 = key sep new; f=1 }
{ print }
END { if (!f) print key sep new }
' file

然后你就不用担心了。上面提到的唯一需要考虑的字符是反斜杠,因为
\t
将被转换为制表符等。当使用
-v
进行变量赋值时,如果出现问题,有一个简单的调整。

有可能进行多个替换吗?我认为应该可以在
sed
中编写包含替换代码和附加代码的脚本,但是只有在没有替换发生的情况下才能到达附加代码。必须从输出中删除
,但除此之外,这是我需要的,谢谢!