【问题标题】:How can replace a specific line in a text file with a shell script?如何用 shell 脚本替换文本文件中的特定行?
【发布时间】:2017-02-14 06:10:59
【问题描述】:

例如,我正在尝试用我的 shell 脚本替换 txt 文件中的特定行;

cat aa.txt:
auditd=0
bladeServerSlot=0

当我运行我的脚本时,我想将“bladeServerSlot”更改为 12,如下所示;

cat aa.txt:
auditd=0
bladeServerSlot=12

你能帮帮我吗?

【问题讨论】:

  • 示例:perl -ne '$_ =~ s/bladeServerSlot\=0/bladeServerSlot\=12/; print $_;' aa.txt
  • 用perl -pe 's/bladeServerSlot=0/bladeServerSlot=12/' aa.txt 写得更好。

标签: linux perl shell


【解决方案1】:
perl -pe 's/bladeServerSlot=\K\d+/12/' aa.txt  > output.txt

\K 是positive lookbehind 的particular form,它会丢弃所有以前的匹配项。所以我们只需要替换下面的内容。 s/ 默认应用于包含当前行的$_。 -p 为每一行打印$_,因此所有其他行都被复制。我们将输出重定向到一个文件。

【讨论】:

    【解决方案2】:

    使用sed 和反向引用:

    sed -r '/bladeServerSlot/ s/(^.*)(=.*)/\1=12/g' inputfile
    

    使用 awk ,这将搜索包含 bladeServerSlot 的行并替换该行的第二列。

    awk  'BEGIN{FS=OFS="="}/bladeServerSlot/{$2=12}1' inputfile
    

    【讨论】:

    • 投反对票的人,请礼貌地解释投反对票的原因。
    • 看起来 sed 会像 /^bladeServerSlot/s/=.*$/=12/ 一样干净
    【解决方案3】:

    真的有必要替换您示例中的行吗?由于bladeServerSlot 是一个变量,您可以重置该值。

    bladeServerSlot=`any command`
    

    或者你可以让这个变量由提供给这个脚本的参数来填充。

    bladeServerSlot=$1
    

    $1是脚本的第一个参数。我认为这将是解决您的问题的更清洁的方法,而不是在这里做花哨的正则表达式。 sed/perl 解决方案可以工作,但对于阅读您的脚本的其他人来说,它们不是很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2018-07-08
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多