相关疑难解决方法(0)

在for循环中使用带有变量的sed的Bash脚本?

我正在尝试编写一个带有一些变量的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)

variables bash scripting sed

11
推荐指数
2
解决办法
6万
查看次数

在Bash中反转文本文件

如何在Bash中反转文本文件?

例如,如果some.txt包含这个:

book
pencil
ruler
Run Code Online (Sandbox Code Playgroud)

那怎么能得到这个呢?:

relur
licnep
koob
Run Code Online (Sandbox Code Playgroud)

bash shell

9
推荐指数
1
解决办法
2104
查看次数

转义sed表达式中的变量中的字符

所以我有一个问题,我的脚本的这部分不起作用.我不确定到底发生了什么,但我感觉到它是因为我没有在变量中转义某些字符.我试了以下没有运气:

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)

bash sed

5
推荐指数
1
解决办法
9134
查看次数

使用Sed将字符串变量替换为字符串变量

我有一个名为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)

linux bash sed

3
推荐指数
2
解决办法
1万
查看次数

删除包含插入符号的所有行(^)

我试过sed -i '/^/d' myfile并删除了整个文件.怎么避免这个?我想删除其中的所有行^.

bash sed

3
推荐指数
1
解决办法
132
查看次数

是否可以在使用位置变量时解决 SC2001(“看看您是否可以使用 ${variable//search/replace} 代替”)?

我正在寻找一个单行代码来替换变量字符串中变量字符串中变量位置的任何字符。我想出了这个工作解决方案:

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,但我不清楚使用位置变量时的正确格式。在官方文档似乎并没有讨论在所有字符串中的定位。

这可能吗?

bash parameter-expansion shellcheck

3
推荐指数
1
解决办法
1053
查看次数

替换路径

我想替换路径

(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)

但两者都给出错误。

我读过这个这个还有这个——但无法使其发挥作用。

编辑

这是一个 …

bash perl sed

2
推荐指数
1
解决办法
3965
查看次数

试图让sed用另一个文件路径替换文件中的文件路径

这是我目前的代码.我试图用另一个文件名替换文件中的文件名字符串.但我目前正在收到错误

"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)

为什么会这样?

bash shell sed

1
推荐指数
1
解决办法
6160
查看次数