【问题标题】:sed or awk to append to specific linesed 或 awk 附加到特定行
【发布时间】:2016-08-22 21:09:39
【问题描述】:

我想通过 bash 脚本编辑一个文件

if [[ -n "$CHROME_USER_DATA_DIR" ]]; then
  exec -a "$0" "$HERE/chrome"  \
    --user-data-dir="$CHROME_USER_DATA_DIR" "$@"
else
  exec -a "$0" "$HERE/chrome"  "$@"
fi

我想在包含 exec -a "$0" "$HERE/chrome" "$@" 字符串的任何行的末尾追加

  --user-data-dir

结果将覆盖现有文件

    if [[ -n "$CHROME_USER_DATA_DIR" ]]; then
      exec -a "$0" "$HERE/chrome"  \
        --user-data-dir="$CHROME_USER_DATA_DIR" "$@"
    else
      exec -a "$0" "$HERE/chrome"  "$@" --user-data-dir
    fi

我在理解 sed 和 awk 时遇到了困难,但我想完成这项工作。

【问题讨论】:

    标签: bash google-chrome awk sed


    【解决方案1】:

    不幸的是,您需要使用正则表达式而不是字符串比较,因为您的空格显然会有所不同,从而引入了一些转义复杂性。使用 GNU awk 表示 -i inplace\s 简写为 [[:space:]]

    awk -i inplace '/exec\s+-a\s+"\$0"\s+"\$HERE\/chrome"\s+"\$@"/{$0=$0 " --user-data-dir"} 1' file
    

    【讨论】:

      【解决方案2】:

      尝试使用 GNU sed 编辑您的文件:

      sed -i '5s/$/& --user-data-dir/' file
      

      【讨论】:

      • & 在匹配空字符串时并不是真正需要的。
      • 谢谢,那会附加到设定的行号吗?我编辑了我的帖子以使其更加清晰。行号可能会有所不同。我想找到以下行:“$0”“$HERE/chrome”“$@”并将其替换为以下行:“$0”“$HERE/chrome”“$@”--user-data-dir
      • @Wintermute:谢谢你的提示。
      • @Tartrantism 如果您想通过正则表达式而不是行号进行匹配,请使用/regex/ 而不是5。在这种情况下,sed '/"\$0" "\$HERE\/chrome" "\$@"/ s/$/ --user-data-dir/' 应该可以工作(未经测试)。
      【解决方案3】:

      使用 awk 你可以做到:

      awk 'NR==5{$0=$0" --user-data-dir"}1' file > newfile
      

      【讨论】:

      • 谢谢,那会附加到设定的行号吗?我编辑了我的帖子以使其更加清晰。行号可能会有所不同。我想找到以下行:“$0”“$HERE/chrome”“$@”并将其替换为以下行:“$0”“$HERE/chrome”“$@”--user-data-dir
      • @Tartrantism 然后按正则表达式过滤。将NR==5 替换为/myregex/
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多