我正在尝试编写一个带有一些变量的bash脚本,然后使用grep对给定的文件搜索进行查找/替换,以获取具有该字符串的文件列表.我认为我遇到的问题是在sed中看到变量我不知道它可能是什么.
if [ "$searchFiles" != "" -a "$oldString" != "" -a "$newString" != "" ]; then
echo -en "Searching for '$searchFiles' and replacing '$oldString' with '$newString'.\n"
for i in `grep $oldString $searchFiles |cut -d: -f1|uniq`; do
sed -i 's/${oldString}/${newString}/g' $i;
done
echo -en "Done.\n"
else
usage
fi
Run Code Online (Sandbox Code Playgroud) 如何在Bash中反转文本文件?
例如,如果some.txt包含这个:
book
pencil
ruler
Run Code Online (Sandbox Code Playgroud)
那怎么能得到这个呢?:
relur
licnep
koob
Run Code Online (Sandbox Code Playgroud) 所以我有一个问题,我的脚本的这部分不起作用.我不确定到底发生了什么,但我感觉到它是因为我没有在变量中转义某些字符.我试了以下没有运气:
crontab -l | sed "s%$CTMP%\*\/$FREQ \* \* \* \* cd $DIR && \.\/$SCRIPT%" | crontab -
Run Code Online (Sandbox Code Playgroud)
以下是每个变量中的最新信息:
CTMP变量只是crontab文件中的一行
CTMP='*/5 * * * * cd /home/admin/whatever && ./test.sh'
Run Code Online (Sandbox Code Playgroud)
该FREQ变量是cron文件的以分钟为单位的时间设置
FREQ=5
Run Code Online (Sandbox Code Playgroud)
DIR变量是当前的工作目录
DIR='/home/admin/whatever'
Run Code Online (Sandbox Code Playgroud)
而SCRIPT变量只是脚本文件名
SCRIPT='test.sh'
Run Code Online (Sandbox Code Playgroud)
我觉得问题是sed语句没有更新crontab文件,因为它没有转义上面这些变量所需的字符.
这是正确的还是其他错误的?
*更新*
CTMPESC=$(sed 's/[\*\.]/\\&/g' <<<"$CTMP")
DIRESC=$(sed 's/[\*\.]/\\&/g' <<<"$DIR")
SCRIPTESC=$(sed 's/[\*\.]/\\&/g' <<<"$SCRIPT")
crontab -l | sed "s%$CTMPESC%\*/$FREQ \* \* \* \* cd $DIRESC && \./$SCRIPTESC%" | crontab -
Run Code Online (Sandbox Code Playgroud)
*更新*
这是crontab输出
*/10 * * * * cd /home/administrator/anm-1.5.0 */7 * * * * cd /home/administrator/anm-1.5.0 …Run Code Online (Sandbox Code Playgroud) 我有一个名为ethernet的文件包含多行.我已将其中一行保存为名为old_line的变量.此变量的内容如下所示:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="2r:11:89:89:9g:ah", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为new_line的第二个变量,它类似于old_line,但在文本中有一些修改.
我想替换的内容old_line与内容NEW_LINE使用SED.到目前为止,我有以下,但它不起作用:
sed -i "s/${old_line}/${new_line}/g" ethernet
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个单行代码来替换变量字符串中变量字符串中变量位置的任何字符。我想出了这个工作解决方案:
echo "$string" | sed "s/./${replacement}/${position}"
Run Code Online (Sandbox Code Playgroud)
示例用法:
string=aaaaa
replacement=b
position=3
echo "$string" | sed "s/./${replacement}/${position}"
aabaa
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我使用包含我当前解决方案的脚本运行 shellcheck 时,它告诉我:
SC2001: See if you can use ${variable//search/replace} instead.
Run Code Online (Sandbox Code Playgroud)
我想使用它建议的参数扩展而不是管道到 sed,但我不清楚使用位置变量时的正确格式。在官方文档似乎并没有讨论在所有字符串中的定位。
这可能吗?
我想替换路径
(setq myFile "/some/path")
Run Code Online (Sandbox Code Playgroud)
在一个文件中。我尝试用 sed 来做到这一点:
find ./_build/html -type f -name '*.html' | while read myFile; do
MyFile=`readlink -f "$myFile"`
sed -i "s/setq myFile [)]*/setq myFile \"$MyFile\"/" sphinx_nowrap.el
# and then some actions on file
done
Run Code Online (Sandbox Code Playgroud)
和 perl:
find ./_build/html -type f -name '*.html' | while read myFile; do
MyFile=`readlink -f "$myFile"`
perl -ne "s/setq myFile .+/setq myFile \"$MyFile\")/" sphinx_nowrap.el
# and then some actions on file
done
Run Code Online (Sandbox Code Playgroud)
但两者都给出错误。
编辑:
这是一个 …
这是我目前的代码.我试图用另一个文件名替换文件中的文件名字符串.但我目前正在收到错误
"sed:1:"s/directory ="[A-Za-z0 ...":替换命令中的坏标志:'U'"
这段代码有什么问题?
function restart_existing ()
{
old="directory = \"[A-Za-z0-9\/]\""
new="directory = \"$1\""
sed -i '' "s/$old/$new/" "$HOME/angelpretendconfig"
}
restart_existing "$HOME/blahblahblah/shoot/blah"
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢!我已经采纳了你的建议,并修改了代码.
function restart_existing ()
{
old="directory = \"*\""
printf -v new 'directory = "%s"' "$1"
sed -i '' "s;$old;$new;" "$HOME/angelpretendconfig"
}
restart_existing "Query"
Run Code Online (Sandbox Code Playgroud)
但现在有问题的话来自
directory = "/home/jamie/bump/server"
directory = "Query"/home/jamie/bump/server"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?