尝试使用sed编辑File中的信息

时间:2015-01-08 09:41:45

标签: shell sed

我有以下代码来更新文件中的信息,但我只希望编辑多个重复项中的一个。我只希望编辑武器X的场地Stan Lee,但是当我运行代码时,它编辑了所有不同领域的Stan Lee。 e.g

$ cat BookDB.txt
Weapon X:Stan Lee
Gambit:Stan Lee
Avengers:Stan Lee

代码:

 function update_author
 {
echo "Title: "
read title_upa
echo "Author: "
read author_upa
grep -iqs "$title_upa:$author_upa:" BookDB.txt && echo "Book Found"
echo "New Author: "
read author_upar
sed  -i s/"$author_upa"/"$author_upar"/ BookDB.txt || tee BookDB.txt && echo "Book Author has been updated sucessfully!"
}

2 个答案:

答案 0 :(得分:1)

sed -i "/^$title_upa:/ s/$author_upa/$author_upar/" BookDB.txt

领先的正则表达式限制了替换。

如果用户输入带有/字符的值,则会中断,因此您应该将其转义:

sed -i "/^${title_upa//\//\\/}:/ s/${author_upa//\//\\/}/${author_upar//\//\\/}/" BookDB.txt

那看起来有点荒谬。让我们尝试不同的工具:

tmp=$(mktemp)
awk -F: -v OFS=: -v title="$title_upa" -v author="$author_upa" -v new="$author_upar" '
    $1 == title && $2 == author {$2 = new}
    {print}
' BookDB.txt > "$tmp" && mv "$tmp" BookDB.txt

答案 1 :(得分:1)

我看到了类似的问题所以这是我的解决方案,在切换作者之前通过获取标题和作者来改变sed行

  sed -i "/^$title:$author:/ s/$author/$author_new/" BookDB.txt