是否有一个sedtodo就地编辑的调用,没有可在Linux和Mac上运行的备份?虽然BSD sed随OS X似乎需要sed -i '' …,在GNU sedLinux的发行版通常都与解释的报价为空,输入文件名(而不是备份扩展),并且需要sed -i …替代.
是否有任何命令行语法适用于这两种风格,所以我可以在两个系统上使用相同的脚本?
我想知道是否有可能编写一个100%可靠的sed命令来转义输入字符串中的任何正则表达式元字符,以便它可以在后续的sed命令中使用.像这样:
#!/bin/bash
# Trying to replace one regex by another in an input file with sed
search="/abc\n\t[a-z]\+\([^ ]\)\{2,3\}\3"
replace="/xyz\n\t[0-9]\+\([^ ]\)\{2,3\}\3"
# Sanitize input
search=$(sed 'script to escape' <<< "$search")
replace=$(sed 'script to escape' <<< "$replace")
# Use it in a sed command
sed "s/$search/$replace/" input
Run Code Online (Sandbox Code Playgroud)
我知道有更好的工具可以使用固定字符串而不是模式,例如awk,perl或python.我想证明是否有可能sed.我会说让我们专注于基本的POSIX正则表达式,以获得更多乐趣!:)
我已经尝试了很多东西,但任何时候我都能找到一个打破了我的尝试的输入.我认为保持它是抽象的,因为script to escape不会导致任何人走错方向.
顺便说一下,讨论在这里提出来了.我认为这可能是收集解决方案的好地方,可能会破坏和/或详细说明.
我有abc.sh:
exec $ROOT/Subsystem/xyz.sh
Run Code Online (Sandbox Code Playgroud)
在Unix机器上,如果我打印,echo $HOME那么我得到/HOME/COM/FILE.
我想更换$ROOT与$HOME使用sed的.
预期产出:
exec /HOME/COM/FILE/Subsystem/xyz.sh
Run Code Online (Sandbox Code Playgroud)
我试过了,但我没有得到预期的输出:
sed 's/$ROOT/"${HOME}"/g' abc.sh > abc.sh.1
Run Code Online (Sandbox Code Playgroud)
加成:
如果我有 abc.sh
exec $ROOT/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh
Run Code Online (Sandbox Code Playgroud)
然后用
sed "s|\$INSTALLROOT/|${INSTALLROOT}|" abc.sh
Run Code Online (Sandbox Code Playgroud)
它只是首先替换$ROOT,即输出即将到来
exec /HOME/COM/FILE/Subsystem/xyz.sh $ROOT/ystem/xyz1.sh
Run Code Online (Sandbox Code Playgroud) 我正在编写一个shell脚本来创建一些配置文件.我必须替换文件中的一些模式,并且应该用路径替换一个模式.
所以我的问题是:有没有办法用路径替换我的占位符webpath而不在斜杠前面设置反斜杠?
也许有另一种工具可以做到这一点?
我似乎无法在sed命令中使用变量,例如:
sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas
Run Code Online (Sandbox Code Playgroud)
我想要$ct_tname变量,而不是字面意思$ct_tname,这是我不断得到的.
有谁知道如何让这个工作?
问题实际上更复杂,我省略了一些信息.
ct_fname="%let outputfile="/user/ct_"$1".csv";"
Run Code Online (Sandbox Code Playgroud)
这里$1是在我的bash脚本开始时传入的参数(sed是在bash脚本中运行的).
这不正常运行,但是它确实运行,如果我取代ct_fname用
ct_fname="%let table=ct_$1;"
Run Code Online (Sandbox Code Playgroud)
有没有办法让第一个ct_fname成功通过?
我怎样才能做到这一点?
sed -i 's/wiki_host/$host_name/g' /root/bin/sync
Run Code Online (Sandbox Code Playgroud)
它将取代wiki_host文本$host_name.但我想用变量的内容替换它..
我试过了
sed -i 's/wiki_host/${host_name}/g' /root/bin/sync
Run Code Online (Sandbox Code Playgroud)
它也不起作用.
sed命令在命令提示符下按预期工作,但在shell脚本中不起作用.
new_db_name=`echo "$new_db_name" | sed 's/$replace_string/$replace_with/'`
Run Code Online (Sandbox Code Playgroud)
为什么会这样,我该如何解决?
我执行以下bash脚本:
#!/bin/bash
version=$1
echo $version
sed 's/\${version.number}/$version/' template.txt > readme.txt
Run Code Online (Sandbox Code Playgroud)
我期望用变量"version"的内容替换$ {version.number}的所有实例.而是插入文字文本$ version.
我需要做什么才能使sed使用$ version的当前值?
我的配置中有一个变量,我想用一个值替换它。
ROOT="rROOT"
Run Code Online (Sandbox Code Playgroud)
我想将其替换为
ROOT="$root"
Run Code Online (Sandbox Code Playgroud)
$root 的值也是如此(重要的是引号)。
到目前为止我已经尝试过这种方式
sed -i s/'ROOT=rROOT'/'ROOT="$root"'/g $directory/settings.conf
Run Code Online (Sandbox Code Playgroud)
结果是
ROOT="$root"
Run Code Online (Sandbox Code Playgroud)
但这存储在变量 $root 中(它始终是一个路径)
root: /
Run Code Online (Sandbox Code Playgroud)
如何用 $root 的值替换 rROOT?
Sed 版本:(GNU sed)4.2.2