追加到文件中的行尾

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.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

【讨论】:

以上是关于追加到文件中的行尾的主要内容,如果未能解决你的问题,请参考以下文章

以下文件中的行尾不一致,要将行尾标准化吗?

vs报错“以下文件中的行尾不一致,是否将行尾标准化”

如何使回车键将光标移动到 Android Studio 中的行尾,就像在 Eclipse 中一样

VS "以下文件中的行尾不一致,要将行尾标准化吗?"

视觉工作室“不一致的行尾”

如何在 VS Code 中的行首或行尾获取多个光标? [复制]