Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本替换一个单词,后跟冒号、空格和数字_Bash_Shell - Fatal编程技术网

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

Bash脚本替换一个单词,后跟冒号、空格和数字,bash,shell,Bash,Shell,我想在一个文件中找到修订号-将有一个用户输入的新修订号,这个新版本将替换旧版本。 例如: 如果用户输入为67,则应替换为67,如下所示 revision: 67 我想要一个bash脚本,它可以找到旧的数字并用新的数字替换。新修订号的值将存储在变量修订号中 到目前为止,我得到的是: #!/bin/bash echo “Insert the new revision number: “ read revision_number sed -e ^revision: \d+$/^revisio

我想在一个文件中找到修订号-将有一个用户输入的新修订号,这个新版本将替换旧版本。 例如:

如果用户输入为67,则应替换为67,如下所示

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

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

#!/bin/bash

echo “Insert the new revision number: “

read revision_number

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

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

sed "s/^revision:.*/revision: ${input}/" file
使用sed 要使用sed就地更改文件,请使用:

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

  • sed支持POSIX正则表达式<代码>\d不是POSIX<代码>[:digit:]是POSIX,它优于
    [0-9]
    ,因为它是unicode安全的

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

  • -i
    告诉sed将文件更改到位

  • 请注意,sed不将
    $revision\u number
    视为数据,而是将其视为命令的一部分这是危险的。恶意值
    $revision\u number
    可能导致文件被删除或覆盖

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

    sed -i -r "s/^revision: [[:digit:]]+$/revision: $revision_number/"  *.txt
    
    对于BSD/OSX sed,将
    -i
    替换为
    -i'

  • 使用GNU awk 要使用GNU awk就地更改文件,请执行以下操作:

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

  • BSD/OSX awk不支持
    -i inplace

  • 由于awk将
    $revision\u number
    视为数据而不是代码,因此使用此方法比sed方法安全得多

  • 使用sed 要使用sed就地更改文件,请使用:

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

  • sed支持POSIX正则表达式<代码>\d不是POSIX<代码>[:digit:]是POSIX,它优于
    [0-9]
    ,因为它是unicode安全的

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

  • -i
    告诉sed将文件更改到位

  • 请注意,sed不将
    $revision\u number
    视为数据,而是将其视为命令的一部分这是危险的。恶意值
    $revision\u number
    可能导致文件被删除或覆盖

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

    sed -i -r "s/^revision: [[:digit:]]+$/revision: $revision_number/"  *.txt
    
    对于BSD/OSX sed,将
    -i
    替换为
    -i'

  • 使用GNU awk 要使用GNU awk就地更改文件,请执行以下操作:

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

  • BSD/OSX awk不支持
    -i inplace

  • 由于awk将
    $revision\u number
    视为数据而不是代码,因此使用此方法比sed方法安全得多

  • perl

    perl


    您的脚本在做什么,您不满意?通过该脚本,我得到了以下响应:“sed:-e expression#1,char 1:unknown command:`^'”sed中的regexp需要用斜杠引入。另外:您忘记引用sed表达式,因此sed只将
    ^revision:
    视为
    -e
    的参数。您的脚本做了哪些您不满意的事情?对于该脚本,我得到了以下响应“sed:-e expression#1,char 1:未知命令:`^')。sed中的regexp需要用斜杠引入。另外:您忘记引用sed表达式,因此sed只将
    ^revision:
    作为
    -e
    的参数;sed-i“s/^revision:.*/revision:${revision_number}/.”/*.txtPlus 1,因为它比我快2分钟;sed-i“s/^revision:.*/revision:${revision\u number}/.”/*.txtPlus 1,因为它比我快2分钟。另外还有一个是非常详细的解释!加上一个非常详细的解释!再加一顶帽子!:)再加一顶帽子!:)