【问题标题】:Sed construct populate list of keys with the environment value of that keySed 构造使用该键的环境值填充键列表
【发布时间】:2022-01-01 02:09:31
【问题描述】:

我有一个文件中的键列表:

FOO
BAR
BAZ

我正在尝试构建一个 sed 命令来替换每一行:

FOO=$FOO
BAR=$BAR
BAZ=$BAZ

右侧是具有该名称的环境变量的值。比如设置环境变量:

export FOO=1
export BAR=2
export BAZ=3

运行 sed 后,文件应该是:

FOO=1
BAR=2
BAZ=3

我试过这些:

  • sed -i 's/^\(.*\)$/\1=$\1/g'
  • sed -i "s/^\(.*\)$/\1=$\1/g"
  • sed -i s/^\(.*\)$/\1="$\1"/g'

还有其他一些变化。问题显然在于捕获组是如何逃脱的,但我不知道如何解决。

【问题讨论】:

  • 它是否必须被sed?使用 awk。或者python。
  • 不,它没有,awk 很好。我宁愿不使用python。
  • 那就用python,很快就搞定了。字面意思是python -c 'for line in sys.stdin: print(line "=" os.getenv(line));
  • The issue is clearly in how the capture group is escaped 怎么清楚? Sed 适用于 text,它不会将 $anything 序列替换为值。
  • '显然'因为捕获有效,添加 = 有效,只是将变量从 $NAME 扩展到 VALUE 不起作用。

标签: bash sed


【解决方案1】:

您无法以您尝试的方式访问 sed 中的环境变量,但使用 awk 非常简单:

awk '{ print $0 in ENVIRON ? $0"="ENVIRON[$0] : $0 } FILE >FILE.new \
&& mv FILE.new FILE || { echo oops; rm FILE.new; }

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed 's/.*/echo "&=$&"/e' file
    

    在替换命令上使用匹配反向引用 &e 评估标志。

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多