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 创建一个字符串,如果字符串已经存在,则替换它的主要内容,如果未能解决你的问题,请参考以下文章