Shell sed删除所有内容,而不是更改单个字段

Shell sed删除所有内容,而不是更改单个字段,shell,sed,Shell,Sed,嗨,我有这个代码,是要更新一个单一的领域标题,但它结束了它删除一切。需要帮忙吗 BookDB.txt: The Hunger Games:Suzanne Collins:1:1:1 Weapon X:Stan Lee:1:1:1 Weapon X:stan lim:1:1:1 修订问题的答覆 需要更改sed命令,因为标题在第一行,而不是作者。由于如下所述的相同原因,删除了tee命令。因此,定义函数如下: update_title () { echo "Title: "; re

嗨,我有这个代码,是要更新一个单一的领域标题,但它结束了它删除一切。需要帮忙吗

BookDB.txt:

The Hunger Games:Suzanne Collins:1:1:1 Weapon X:Stan Lee:1:1:1 Weapon X:stan lim:1:1:1 修订问题的答覆 需要更改
sed
命令,因为标题在第一行,而不是作者。由于如下所述的相同原因,删除了
tee
命令。因此,定义函数如下:

update_title () 
{ 
    echo "Title: ";
    read title;
    echo "Author: ";
    read author;
    grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!";
    echo "New Title: ";
    read title_new;
    sed -i "/:$author:/ s/^$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
例如,调用函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
结果是:

$ cat BookDB.txt 
The Hunger Games:Suzanne Collins:1:1:1
Weapon XYZ:Stan Lee:1:1:1
Weapon X:stan lim:1:1:1
原问题的答案 替换:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt || tee BookDB.txt && echo "Book Title has been updated sucessfully!"
为此:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
第一行要求
sed
就地重写
BookDB.txt
。然后它要求
tee
覆盖同一文件。解决办法是只做第一件事

解释 命令,例如:

sed 's/old/new/' file >file
或:

这将是不可靠的。它们试图在写入文件的同时读取文件。根据文件的缓冲方式,这种类型的命令可能偶尔会工作,但永远不可信

sed-i
是专门为避免此问题而设计的。它写入临时文件,并在成功保存所有更改后覆盖源文件

例子 让我们定义这个函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
现在,让我们使用它:

$ cat BookDB.txt 
Tim:Old Title:
Tom:Older Title:
$ update_title 
Title: 
Old Title
Author: 
Tim
New Title: 
New Title
Book Title has been updated sucessfully!
$ cat BookDB.txt 
Tim:New Title:
Tom:Older Title:
旧标题已成功替换

警告 此函数将shell变量直接替换为
sed
命令。如果用户不知道sed活动字符的威力,结果可能会令人惊讶

例如:

$ update_title 
Title: 
.*
Author: 
Tim
New Title: 
This & That
Book Title has been updated sucessfully!
现在,观察新文件:

$ cat BookDB.txt 
This Tim:New Title: That
Tom:Older Title:
OSX 在OSX上,sed的
-i
选项需要一个参数。对于OSX和可能的其他BSD平台,将函数定义中的
sed
行替换为:

   sed -i .bak "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
或者

修订问题的答覆 需要更改
sed
命令,因为标题在第一行,而不是作者。由于如下所述的相同原因,删除了
tee
命令。因此,定义函数如下:

update_title () 
{ 
    echo "Title: ";
    read title;
    echo "Author: ";
    read author;
    grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!";
    echo "New Title: ";
    read title_new;
    sed -i "/:$author:/ s/^$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
例如,调用函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
结果是:

$ cat BookDB.txt 
The Hunger Games:Suzanne Collins:1:1:1
Weapon XYZ:Stan Lee:1:1:1
Weapon X:stan lim:1:1:1
原问题的答案 替换:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt || tee BookDB.txt && echo "Book Title has been updated sucessfully!"
为此:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
第一行要求
sed
就地重写
BookDB.txt
。然后它要求
tee
覆盖同一文件。解决办法是只做第一件事

解释 命令,例如:

sed 's/old/new/' file >file
或:

这将是不可靠的。它们试图在写入文件的同时读取文件。根据文件的缓冲方式,这种类型的命令可能偶尔会工作,但永远不可信

sed-i
是专门为避免此问题而设计的。它写入临时文件,并在成功保存所有更改后覆盖源文件

例子 让我们定义这个函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
现在,让我们使用它:

$ cat BookDB.txt 
Tim:Old Title:
Tom:Older Title:
$ update_title 
Title: 
Old Title
Author: 
Tim
New Title: 
New Title
Book Title has been updated sucessfully!
$ cat BookDB.txt 
Tim:New Title:
Tom:Older Title:
旧标题已成功替换

警告 此函数将shell变量直接替换为
sed
命令。如果用户不知道sed活动字符的威力,结果可能会令人惊讶

例如:

$ update_title 
Title: 
.*
Author: 
Tim
New Title: 
This & That
Book Title has been updated sucessfully!
现在,观察新文件:

$ cat BookDB.txt 
This Tim:New Title: That
Tom:Older Title:
OSX 在OSX上,sed的
-i
选项需要一个参数。对于OSX和可能的其他BSD平台,将函数定义中的
sed
行替换为:

   sed -i .bak "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
或者

修订问题的答覆 需要更改
sed
命令,因为标题在第一行,而不是作者。由于如下所述的相同原因,删除了
tee
命令。因此,定义函数如下:

update_title () 
{ 
    echo "Title: ";
    read title;
    echo "Author: ";
    read author;
    grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!";
    echo "New Title: ";
    read title_new;
    sed -i "/:$author:/ s/^$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
例如,调用函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
结果是:

$ cat BookDB.txt 
The Hunger Games:Suzanne Collins:1:1:1
Weapon XYZ:Stan Lee:1:1:1
Weapon X:stan lim:1:1:1
原问题的答案 替换:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt || tee BookDB.txt && echo "Book Title has been updated sucessfully!"
为此:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
第一行要求
sed
就地重写
BookDB.txt
。然后它要求
tee
覆盖同一文件。解决办法是只做第一件事

解释 命令,例如:

sed 's/old/new/' file >file
或:

这将是不可靠的。它们试图在写入文件的同时读取文件。根据文件的缓冲方式,这种类型的命令可能偶尔会工作,但永远不可信

sed-i
是专门为避免此问题而设计的。它写入临时文件,并在成功保存所有更改后覆盖源文件

例子 让我们定义这个函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
现在,让我们使用它:

$ cat BookDB.txt 
Tim:Old Title:
Tom:Older Title:
$ update_title 
Title: 
Old Title
Author: 
Tim
New Title: 
New Title
Book Title has been updated sucessfully!
$ cat BookDB.txt 
Tim:New Title:
Tom:Older Title:
旧标题已成功替换

警告 此函数将shell变量直接替换为
sed
命令。如果用户不知道sed活动字符的威力,结果可能会令人惊讶

例如:

$ update_title 
Title: 
.*
Author: 
Tim
New Title: 
This & That
Book Title has been updated sucessfully!
现在,观察新文件:

$ cat BookDB.txt 
This Tim:New Title: That
Tom:Older Title:
OSX 在OSX上,sed的
-i
选项需要一个参数。对于OSX和可能的其他BSD平台,将函数定义中的
sed
行替换为:

   sed -i .bak "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
或者

修订问题的答覆 需要更改
sed
命令,因为标题在第一行,而不是作者。由于如下所述的相同原因,删除了
tee
命令。因此,定义函数如下:

update_title () 
{ 
    echo "Title: ";
    read title;
    echo "Author: ";
    read author;
    grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!";
    echo "New Title: ";
    read title_new;
    sed -i "/:$author:/ s/^$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
例如,调用函数:

$ update_title 
Title: 
Weapon X
Author: 
Stan Lee
Book Found!
New Title: 
Weapon XYZ
Book Title has been updated sucessfully!
function update_title
{
   echo "Title: "
   read title
   echo "Author: "
   read author
   grep -iqs "$title:$author:" BookDB.txt && echo "Book Found!"
   echo "New Title: "
   read title_new   
   sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
}
结果是:

$ cat BookDB.txt 
The Hunger Games:Suzanne Collins:1:1:1
Weapon XYZ:Stan Lee:1:1:1
Weapon X:stan lim:1:1:1
原问题的答案 替换:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt || tee BookDB.txt && echo "Book Title has been updated sucessfully!"
为此:

sed -i "/^$author:/ s/$title/$title_new/" BookDB.txt && echo "Book Title has been updated sucessfully!"
第一行要求
sed
就地重写
BookDB.txt
。然后它要求
tee
覆盖同一文件。解决办法是只做第一件事

解释 命令,例如:

sed 's/old/new/' file >file
或:

这将是不可靠的。它们试图在写入文件的同时读取文件。根据文件的缓冲方式,这种类型的命令可能偶尔会工作,但永远不可信

sed-i
是专门为避免此问题而设计的。它写入一个临时文件,并在成功保存所有更改后