Bash 创建一个字符串,如果字符串已经存在,则替换它

Posted

技术标签:

【中文标题】Bash 创建一个字符串,如果字符串已经存在,则替换它【英文标题】:Bash creating a string, if string already exists replace it 【发布时间】:2021-09-26 01:27:58 【问题描述】:

我想实现这个程序。 我有这个命令: sed -i -e 's/few/asd/g' /usr/local/sbin/.myappenv 如果文件.myappenv 中有few 字符串文本,则此命令有效。但无论是否找到 few,此命令都无法简单地创建 asd 文本。

所以,如果有 few 文本,应该替换它,如果 few 文本丢失,只需在第一行创建它

编辑_:

它应该在文档的第一行创建字符串.myappenv,只有在没有巧合的情况下才应该创建。

文件.myappenv 应该包含=>

asd

如果文件已经填充了few,只需替换它 =>

asd

【问题讨论】:

just create it. 在哪里?在行的开头?最后?在第 5 个字符处? 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。 抱歉没有指定,它应该在第一行创建它@KamilCuk 我编辑了问题以解释我面临的问题@Cyrus 我还是不明白。似乎有两种情况:文件包含few,或者不包含。你能显示这两种场景的输入和期望的输出吗? 【参考方案1】:

这可能对你有用(GNU sed):

sed 'H;$!d;x;/few/!s/^/asd/;t;s//asd/;s/.//' file

在保留空间中复制文件(第一行将有一个前置换行符)。

在文件末尾,如果few不匹配,则插入文字asd

否则,将第一次出现的few 替换为asd,并删除文件开头引入的换行符。

要将所有出现的few 替换为asd,请使用:

sed 'H;$!d;x;/few/!s/^/asd/;t;s//asd/g;s/.//' file

替代方案:

grep -q few file && sed 's/few/asd/' file || (echo asd; cat file)

【讨论】:

【参考方案2】:

使用单个awk 你可以这样使用:

awk 'FNR == NR if (/few/) n = 1; nextfile; next
FNR == 1 && !n print "asd" n gsub(/few/, "asd") 1' file file

【讨论】:

【参考方案3】:

如果文本少,就替换掉,如果少了,就在第一行创建。

这是一个如果。

if <file has text>; then <replace text>; else <add text to first line>; fi

或在 bash 中:

file=/usr/local/sbin/.myappenv
if grep -q few "$file"; then
     sed 's/few/asd/' "$file"
else
      
        echo asd
        cat "$file"
      > "$file".tmp
     mv "$file".tmp "$file"
fi

How to test if string exists in file with Bash? https://unix.stackexchange.com/questions/99350/how-to-insert-text-before-the-first-line-of-a-file 和 https://mywiki.wooledge.org/BashGuide/TestsAndConditionals 。您可能会对某些自动化方法感兴趣,例如 ansible lineinfile 或 chezmoi,具体取决于目标。

【讨论】:

以上是关于Bash 创建一个字符串,如果字符串已经存在,则替换它的主要内容,如果未能解决你的问题,请参考以下文章

Java求助:如何判断某对象是不是存在?如果不存在,创建该对象

Bash 脚本:避免空字符串参数

求Bash Shell脚本,判定文件是不是存在。

脚本1-38

Java中String为什么是不可变的

如果文件不存在,则创建它并将字符串写入其中。如果确实如此,则将字符串附加到它。工作不正常