首页 > 解决方案 > 用于查找/替换字符串变量的简单 bash 函数(无文件)

问题描述

我只是想要一个函数(或只是一个 1-liner)来查找/替换变量内的字符串,而不用担心变量是否包含疯狂的字符。

伪代码:

findReplace () {
  #what goes here?
}

myLongVar="some long \crazy/ text my_placeholder bla"

replace="my_placeholder"
replaceWith="I like hamburgers/fries"

myFinalVar=$(findReplace $myLongVar $replace $replaceWith)

所有类似的问题看起来都很复杂并且使用文件

标签: bashshell

解决方案


您可以像这样定义函数:

findReplace1() {
    printf "%s" "${1/"$2"/$3}"
}

然后像这样运行它:

myFinalVar=$(findReplace "$myLongVar" "$replace" "$replaceWith")

请注意双引号——它们非常重要,因为没有它们,bash 会将变量的值拆分为单独的单词(例如"some long \crazy/ text..."-> "some" "long" "\crazy/" "text..."),并且还会尝试将任何看起来像通配符的内容扩展为匹配的文件名列表。可以将它们放在作业的右侧 ( myFinalVar=...),但这是少数可以的地方之一。另外,请注意,在函数中我放了双引号$2- 在这种情况下,它再次被视为通配符模式,但这里它是一个字符串匹配通配符而不是文件名。哦,我使用printf "%s"而不是echo因为某些版本的echo字符串会使用包含反斜杠和/或以“-”开头的字符串来做奇怪的事情。

而且,当然,您可以跳过该功能并直接进行替换:

myFinalVar=${myLongVar/"$replace"/$replaceWith}

推荐阅读