Linux 附加到特定行的末尾

Linux 附加到特定行的末尾,linux,bash,sed,awk,Linux,Bash,Sed,Awk,希望这对外面的人来说是个简单的问题。我很确定我知道我需要用什么,但我不知道如何让它工作。问题是: 我有一个平面文件数据库。我们就叫它file.db吧 下面是file.db中的一些示例行 #file.db # line1|example|sample|name|flag|blah line2|example|sample|name|flag|blah line3|example|sample|name|flag|blah 基本上,脚本计算tar文件的MD5散列。假设tar文件的散列=1234ab

希望这对外面的人来说是个简单的问题。我很确定我知道我需要用什么,但我不知道如何让它工作。问题是:

我有一个平面文件数据库。我们就叫它file.db吧

下面是file.db中的一些示例行

#file.db
#
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah
line3|example|sample|name|flag|blah
基本上,脚本计算tar文件的MD5散列。假设tar文件的散列=1234abcd

我需要将MD5总和和另一个分隔符(|)附加到file.db中的特定行

例如:

#file.db
#
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah|1234abcd
line3|example|sample|name|flag|blah
它附加到的行当然由变量控制。我尝试过使用sed和awk,但就是不明白语法

更新 谢谢你们,现在有解决办法了。以下是我最后做的:

HASH=`md5sum tmp/$URL.tgz | awk '{ print $1 }'`
DBLINE=5
awk -v OFS="|" -v l="$DBLINE" -v h="$HASH" 'NR==l{print $0,h;next}1' databases/$WEB > /tmp/$WEB.tmp && mv /tmp/$WEB.tmp databases/$WEB

谢谢你,肯特和其他回答的人。

试试这个awk一行:

line=2
awk -v line="$line" 'FNR==line {printf("%s%s\n" $0, "|123abcd") ;next}
                     {print $0}' infile > newfile
line=2
awk -v OFS="|" -v l="$line" 'NR==l{print $0,"123abc";next}1'
使用您的示例输入:

kent$  echo "line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah
line3|example|sample|name|flag|blah"|awk -v OFS="|" -v l="$line" 'NR==l{print $0,"123abc";next}1'                                                                           
line1|example|sample|name|flag|blah
line2|example|sample|name|flag|blah|123abc
line3|example|sample|name|flag|blah
如果要将输出保存回原始文件:

awk '....' file.db > /tmp/file.db.tmp && mv file.db.tmp /path/to/your/file.db
编辑

如果还需要md5哈希的变量:

 line=2
 hsh="whatever"
 awk -v OFS="|" -v l="$line" -v h="$hsh" 'NR==l{print $0,h;next}1'
看一看。我想,它已经为你找到了答案。 我可以补充一点,您可以在sed中使用正则表达式模式:

sed '/.*line2.*/ a |123asdfasdf' out.db

这应该有效+

变量中有什么?要更改的行与其他行有何不同?
awk
具有
NR
行数。这可能会对你有所帮助。很好,这似乎是可行的,但我似乎不能在你当前有hash(123abc)@user2272450的地方使用变量。是的,你可以。请参见答案中的编辑。谢谢,但我最终找到了类似的解决方案。请参阅原始帖子中的更新。谢谢,但我最终找到了类似的解决方案。请参阅原始帖子中的更新。谢谢,但我最终找到了类似的解决方案。请参阅原始帖子中的更新。
set LN = 5
set MS = 1234abcd
sed -i.bak $LN's/$/|'$MS'/' file.db