【问题标题】:Append to end of a line in a file追加到文件中的行尾
【发布时间】:2021-09-04 13:02:19
【问题描述】:

所以我有一个keywords.robot 文件,其开头如下所示:

***SETTINGS***
library   rfgui.py   maximum_allowed_heartbeats_missed=2  DISPLAY=12
library   OperatingSystem
library   others.py

现在该文件将使用 Docker 运行,但上面的 DISPLAY 的值更改为 0,例如

***SETTINGS***
library   rfgui.py   maximum_allowed_heartbeats_missed=2  DISPLAY=0
library   OperatingSystem
library   others.py

我可以在 Dockerfile 的 RUN 部分中使用 sed/awk 命令来改变这一点,所以我的 Dockerfile RUN 部分可能类似于:

RUN ["sh", "sed (...) > keywords.robot", "robot keywords.robot"]

【问题讨论】:

  • display关键字后面有没有可能出现文字?
  • 没有@BarathVutukuri

标签: python awk sed robotframework


【解决方案1】:

我会使用 GNU AWK 来完成这个任务,让 file.txt 内容成为

***SETTINGS***
library   rfgui.py   maximum_allowed_heartbeats_missed=2  DISPLAY=12
library   OperatingSystem
library   others.py

然后

awk '$NF~/^DISPLAY=/{$NF="DISPLAY=0"}{print}' file.txt

输出

***SETTINGS***
library rfgui.py maximum_allowed_heartbeats_missed=2 DISPLAY=0
library   OperatingSystem
library   others.py

解释:如果最后一列内容 ($NF) 以 (^) DISPLAY= 开头,则将最后一列内容设置为 DISPLAY=0。对于每一行做print。请注意,这种原样会将多个空格压缩到单个空格中,以用于进行修改的行。如果您必须有 3 个空格,请将代码更改为 awk 'BEGIN{OFS=" "}$NF~/^DISPLAY=/{$NF="DISPLAY=0"}{print}' file.txt

(在 gawk 4.2.1 中测试)

【讨论】:

    【解决方案2】:

    如果您有-E-i 的GNU sed 和\s/\S[[:space:]][^[:space:]] 的简写:

    $ sed -Ei 's/(\sDISPLAY=)\S+/\10/' keywords.robot
    $ cat keywords.robot
    ***SETTINGS***
    library   rfgui.py   maximum_allowed_heartbeats_missed=2  DISPLAY=0
    library   OperatingSystem
    library   others.py
    

    【讨论】:

    • sed -iE 's/( DISPLAY=)[[:digit:]]+/\10/' filename 会更好,这样之后出现的任何其他关键字都不会被替换。
    • @BarathVutukuri 很公平,但我会使用[^[:space:]]+ 而不是[[:digit:]],因为我不知道DISPLAY 可能持有什么值,例如也许DISPLAY=27.2DISPLAY="3"DISPLAY=$default 是有效值。
    • 是的,看起来好多了:)
    【解决方案3】:

    第一种解决方案:使用您展示的示例。使用awk,您可以尝试以下替换方式。这仅处理 1 次 DISPLAY=digits(.digits 在此处匹配可选) 您可以在此处从 sub 更改为 gsub 以进行多次替换。

    awk '{sub(/DISPLAY=[0-9]+(\.[0-9]+)?/,"DISPLAY="0)} 1' Input_file
    

    第二个解决方案 使用 GNU awk 使用 RS(记录分隔符)选项尝试:

    awk -v RS='DISPLAY=[0-9]+(\.[0-9]+)?' '{sub(/=[0-9]+/,"=0",RT);ORS=RT} 1' Input_file
    

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 2015-08-12
      • 2023-03-02
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2014-06-02
      相关资源
      最近更新 更多