linux - 从文本文件进入一行并编辑它

标签 linux bash shell edit

假设我的文本文件中有这一行,格式如下。

"Title:Author:Price:QtyAvailable:QtySold"

我的文本文件的内容如下所示

 Hello World:Andreas:10.50:10:5
 Lord Of The Rings:Duke:50.15:50:20
    (some other records...)

1) 用户输入作者和标题。

2) 如果程序找到作者+标题,它会要求用户更新任何可用字段(对于本例,标题、作者、价格等。

3) 例如,我想更新《Hello World》这本书的价格。

4) 我该怎么做才能告诉程序提取 Hello World 行的内容,并进入 10.50 以替换书的价格? (假设图书的新价格将由用户输入决定)

希望得到我的答复。 提前感谢那些提供帮助的人!

最佳答案

您可以像这样使用带可变参数的 sed:

# book title:author to be searched
BOOK="Hello World:Andreas"

# price to be updated
PRICE=11.25

# search and update with original backed up with .bak extension
sed -i.bak 's/\('"$BOOK"'\):[^:]*:/\1:'"$PRICE"':/' file.txt

解释:

如果您将 shell 变量填入 sed 命令,它将如下所示:

sed 's/\(Hello World:Andreas\):[^:]*:/\1:11.25:/'

匹配

"$BOOK"                 # match literal text i.e. Hello World:Andreas
\($BOOK\)               # group this text to be back referenced later
:                       # match literal :
[^:]*                   # match 0 or more characters until : is found
:                       # match a :

替换

\1                      # group # 1 i.e. Hello World:Andreas
:                       # a literal :
$PRICE                  # fill in the new price
:                       # literal :                   

本质上,此 sed 命令正在查找具有 Hello World:Andreas: 后跟 一些价格值,然后是另一个 : 的文本。一旦找到这个模式,它就会用反向引用 #1(即 Hello World:Andreas)替换它,然后是一个 :,然后输入新的价格值和一个冒号 :.

编辑:强烈建议您阅读一些 sed 教程,但是根据您的评论,我正在为您提供更新数量的命令:

# book title:author to be searched
BOOK="Hello World:Andreas"

# quantity to be updated
QTY=18

# search and update with original backed up with .bak extension
sed 's/^\('"$BOOK"'\):\([^:]*\):[^"]*:/\1:\2:'"$QTY"':/'

关于linux - 从文本文件进入一行并编辑它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022278/

相关文章:

linux - 使用 kate 编辑器的硬链接(hard link)

bash - 如何摆脱重复?

linux - 如何在 linux 模块中打开另一个设备?

linux - nfs 文件共享未挂载

linux - Gawk 在找到 3 行之间的最小值时无法正常工作

linux - 通过shell脚本将参数添加到conf文件中

bash - 是否需要指定 EXIT 以外的陷阱?

java - 有没有Java版本管理器?

C++ linux 监控 sigsegv 进程

linux - bash 中的 sed 不会产生预期的行为