Bash脚本替换一个单词后跟冒号,后跟一个空格,然后是一个数字

时间:2017-12-19 19:56:19

标签: bash shell

我想在文件中找到修订号 - 将从用户输入新的修订号,而新的修订号将替换旧的修订号。 例如:

revision: 56
如果用户输入为67,则应将

替换为67,如下所示;

revision: 67

我想要一个bash脚本,它会找到旧的数字并用新的数字替换旧数字。新修订号的值将存储在变量revision_number中。

到目前为止,这是我得到的:

#!/bin/bash

echo “Insert the new revision number: “

read revision_number

sed -e  ^revision: \d+$/^revision: $revision_number$  *.txt

3 个答案:

答案 0 :(得分:2)

像这样:

sed "s/^revision:.*/revision: ${input}/" file

答案 1 :(得分:2)

使用sed

要使用sed更改文件,请使用:

sed -i -E "s/^revision: [[:digit:]]+$/revision: $revision_number/"  *.txt

备注:

  1. sed支持POSIX正则表达式。 \d不是POSIX。 [[:digit:]]是POSIX,优于[0-9],因为它是unicode安全的。

  2. POSIX的基本正则表达式不支持
  3. +。使用-E获取扩展的正则表达式。

  4. -i告诉sed更改文件。

  5. 请注意,sed不会将$revision_number视为数据,而是将其视为命令的一部分。 这很危险。 $revision_number的恶意值可能导致文件被删除或覆盖。

  6. 兼容性:以上适用于现代GNU sed。对于非常旧的GNU sed,请将-E替换为-r

    sed -i -r "s/^revision: [[:digit:]]+$/revision: $revision_number/"  *.txt
    

    对于BSD / OSX sed,将-i替换为-i ''

    sed -i '' -E "s/^revision: [[:digit:]]+$/revision: $revision_number/"  *.txt
    
  7. 使用GNU awk

    使用GNU awk就地更改文件:

    gawk -i inplace -v r="$revision_number" '{sub(/^revision: [[:digit:]]+/, "revision: " r)} 1' *.txt
    

    备注:

    1. BSD / OSX awk不支持-i inplace

    2. 由于awk将$revision_number视为数据而不是代码,因此使用它比使用sed方法更安全。

答案 2 :(得分:1)

perl的

perl -i -spe 's/^revision:\s+\K\d+/$revno/g' -- -revno="$revision_number" *.txt