追加到文件中一行的末尾
Append to end of a line in a file
所以我有一个 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
我可以在 Docker 文件的 运行 部分使用可以更改此设置的 sed/awk 命令吗,所以我的 Docker 文件 运行 部分可能类似于:
RUN ["sh", "sed (...) > keywords.robot", "robot keywords.robot"]
如果您有 -E
和 -i
和 \s/\S
shorthand [[:space:]]
和 [^[:space:]]
的 GNU sed:
$ sed -Ei 's/(\sDISPLAY=)\S+//' keywords.robot
$ cat keywords.robot
***SETTINGS***
library rfgui.py maximum_allowed_heartbeats_missed=2 DISPLAY=0
library OperatingSystem
library others.py
第一个解决方案: 使用您显示的示例。使用 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
我会按照以下方式使用 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 中测试)
所以我有一个 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
我可以在 Docker 文件的 运行 部分使用可以更改此设置的 sed/awk 命令吗,所以我的 Docker 文件 运行 部分可能类似于:
RUN ["sh", "sed (...) > keywords.robot", "robot keywords.robot"]
如果您有 -E
和 -i
和 \s/\S
shorthand [[:space:]]
和 [^[:space:]]
的 GNU sed:
$ sed -Ei 's/(\sDISPLAY=)\S+//' keywords.robot
$ cat keywords.robot
***SETTINGS***
library rfgui.py maximum_allowed_heartbeats_missed=2 DISPLAY=0
library OperatingSystem
library others.py
第一个解决方案: 使用您显示的示例。使用 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
我会按照以下方式使用 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 中测试)