追加到文件中的行尾
Posted
技术标签:
【中文标题】追加到文件中的行尾【英文标题】: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 【参考方案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 'BEGINOFS=" "$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.2
或DISPLAY="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
【讨论】:
以上是关于追加到文件中的行尾的主要内容,如果未能解决你的问题,请参考以下文章