我是Bash的新手,我正在尝试创建一个bash函数:
1)在我当前目录的子文件夹中查找与递归($1
)匹配的所有文件名
2)找到并替换与变量字符串($2
)中的模式匹配的整行与第二个变量字符串($3
)
我认为我大部分时间都在那里,但是在替换包含空格的文本字符串时遇到了麻烦。我目前的功能如下:
rplcPhrase() {
find . -name $1 -exec sed -i "/$2/c $3" {} +
}
rplcPhrase $1 $2 $3
和命令行输入看起来像
/link/to/file.sh "filetochange.txt" "\!phrase[[:space:]]to[[:space:]]change" "replacement[[:space:]]phrase"
研究类似问题已经解释了需要“逃避”特殊字符(例如“!”)以便在模式中使用,并且必须在搜索模式中使用[[:space:]]
来考虑空格。但是,我想返回一个包含空格的短语。上面命令行输入的结果正确找到模式
!phrase to change
但用
代替replacement[[:space:]]phrase
如果我改为使用replacement[[:space:]]phrase
更改replacement phrase
,则只会产生
replacement
就像我说的那样,我觉得我差不多就在那里,我只是错过了一些简单的事情。任何帮助,将不胜感激。
我已经搜索过这个,但找不到能解决我问题的解决方案。查看链接: Replace whole line containing a string using Sed
Using sed to replace text with spaces with a defined variable with slashs
答案 0 :(得分:1)
您需要引用变量以防止分词和通配符扩展。
rplcPhrase() {
find . -name "$1" -exec sed -i "/$2/c $3" {} +
}
rplcPhrase "$1" "$2" "$3"