我有以下代码来更新文件中的信息,但我只希望编辑多个重复项中的一个。我只希望编辑武器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!"
}
答案 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