bash sed截断文件而不是替换文本

huangapple go评论62阅读模式
英文:

bash sed truncates file instead of replacing text

问题

bash sed截断文件而不是替换文本。

我想要使用sed在bashrc源中更新变量,但令我惊讶的是,sed截断了文件。

为了测试,我有一个小文件abc:

export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export myip=1.2.3.4

以及这个测试脚本:

#!/bin/bash
myip=1.2.3.4; newip=5.6.7.8
sed -ni 's/$myip/$newip/' abc 

运行该脚本会使abc文件变为空。为什么会这样?

我在Intel I7上使用Ubuntu 22.04。

英文:

bash sed truncates file instead of replacing text.

I want to update variables in bashrc source with sed but to my surprise sed truncates the file.

For testing i have a little file abc:

export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export myip=1.2.3.4

and this test script:

#!/bin/bash
myip=1.2.3.4; newip=5.6.7.8
sed -ni 's/$myip/$newip/' abc 

running the script leaves abc empty.
Why is this so?

I am using Ubuntu 22.04 on an Intel I7.

答案1

得分: 1

这是因为您使用的引号、-n 选项以及替代物后面没有 p

在 bash 中,单引号 ' 确保文本被字面解释,不进行变量扩展。因此,您可能希望使用双引号 "

因为您使用了 -n,所以您可能还想使用 p 打印要保留的行:

sed -ni "s/$myip/$newip/p" abc

请注意,如果您想保留不匹配的行,只需删除 -n

还要注意,您的 myip 模式中的 . 匹配任何字符。因此,您的模式 1.2.3.4 将匹配 IP 地址 112.3.4.9 中的 112.3.4 部分,然后变为 5.6.7.8.9

英文:

That is because of the quotes that you use, the -n option and the absence of a p behind the substitute.

In bash, the single quote ' makes sure that the text is taken literally, without variable expansion. So, you would probably want to use double quotes ".

Because yo use -n, you will probably want to print the line that you want to keep as well with the p:

sed -ni "s/$myip/$newip/p" abc

Note that, if you want to keep the lines that do not match, you just remove the -n.

Note too that the . in your myip pattern matches any character. So, your pattern 1.2.3.4 will match the 112.3.4 part of the IP address 112.3.4.9, which will then become 5.6.7.8.9.

答案2

得分: 0

你的脚本中有两个错误。

  1. 当你将字符串括在单引号 ' 中时,不会发生bash变量的替换。你需要使用双引号 "

  2. 如果你使用 -n 选项,除了你不使用的 p 命令之外,不会产生任何输出。

正确的脚本是:

#!/bin/bash
myip=1.2.3.4; newip=5.6.7.8
sed -i "s/$myip/$newip/" abc 
英文:

There are two errors in your script.

  1. When you enclose a string into single quotes ', the substitution of the bash variables will not happen. You have to use double quotes ".

  2. If you use the -n option, you will produce no output except with the command p that you don't use.

The correct script is:

#!/bin/bash
myip=1.2.3.4; newip=5.6.7.8
sed -i "s/$myip/$newip/" abc 

huangapple
  • 本文由 发表于 2023年5月28日 18:18:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/76350992.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定