自定义脚本上的 sed 和变量替换

自定义脚本上的 sed 和变量替换

好吧,我在这里问是因为我有大约 12 个小时尝试使用互联网上的示例在自定义脚本上使用 sed 进行替换。

在文件中 a 有很多行,但我想替换“=”之后的值如下

[Paths]
config=
data=
mupen64plus=
plugins=
roms=

[Plugins]
audio=
input=
rsp=
video=

我需要在替换后放入结果中的值:嗯,我需要变量“$PWD”的结果,而不是字面上的“$PWD”

[Paths]
config="$PWD/Datos/config"
data="$PWD/Datos/config"
mupen64plus="$PWD/$EJECUTABLE"
plugins=./.libs/64Bits/plugin
roms="$PWD/Roms"

[Plugins]
audio=mupen64plus-audio-sdl
input=mupen64plus-input-sdl
rsp=mupen64plus-rsp-cxd4-sse2
video=mupen64plus-video-glide64mk2

因为我花了太多时间尝试这样的事情:

sed -i "s|mupen64plus=.*\"|mupen64plus="$PWD/"$EJECUTABLE\"|g" "file.conf"

这不会使某些内容存档

另一种变化如:

sed "s#^(mupen64plus=).*#\l ${"\/`pwd`"//#/\\#}#" "file.conf"

显示“不良替代”或类似内容

我尝试但不起作用的另一件事:

sed 's:#mupen64plus=:'`pwd`':' "file.conf"

这 :

sed -E "s/(data=).*/\1\.\/Datos\/\config/" "./file.conf"

进行此替换:

data=./Datos/nfig

sed -E "s/(data=).*/\1\.\/Datos\/\c\/o\/nfig/" "./Datos/config/mupen64plus-qt.conf"
data=./Datos/oo/nfig

sed -E "s/(data=).*/\1\.\/Datos\\co\nfig/" "./Datos/config/mupen64plus-qt.conf"
data=./Datos/

好吧,或者使用像 awk 这样的其他东西更容易,有人可以帮助我吗?

答案1

使用你的骨架配置文件

VAR1=/home/archemar
VAR2=some/lib
sed -e "/^mupen64plus/s:=.*$:=${VAR1}/${VAR2}:" \
    -e "/^config/s:=.*:=${VAR1}/DataOs/config:" config

在哪里

  • 前两行初始化变量
  • -e在sed中引入编辑命令
  • /^mupen64plus/适用于以 ( ^) 模式开头的行(此处固定 string mupen64plus
  • s: : :替换,用作:分隔符而不是/斜杠,因此不需要转义
  • =.*替换=、任何字符 ( .)、任何数字 ( *) 直到行尾(a$是多余的,因为*会匹配尽可能多的)
  • =${VAR1}/${VAR2}=和值${VAR1}/${VAR2}(实际的扩展是通过调用 shell (可能是 bash)来完成,这就是为什么我们需要双引号而不是单引号)

结果是

[Paths]
config=/home/archemar/DataOs/config
data=
mupen64plus=/home/archemar/some/lib
plugins=
roms=

[Plugins]
audio=
input=
rsp=
video=

我建议不要使用就地版本 ( -i),或使用备份文件

sed -i .bak "/^mupen64plus/s:=.*$:=${VAR1}/${VAR2}:
    /^config/s:=.*:=${VAR1}/DataOs/config:" config

另一种方法是这里的文档

cat <<END-OF-FILE > config
[Paths]
config="$PWD/Datos/config"
data="$PWD/Datos/config"
mupen64plus="$PWD/$EJECUTABLE"
plugins=./.libs/64Bits/plugin
roms="$PWD/Roms"

[Plugins]
audio=mupen64plus-audio-sdl
input=mupen64plus-input-sdl
rsp=mupen64plus-rsp-cxd4-sse2
video=mupen64plus-video-glide64mk2
END-OF-FILE

这将写入一个配置文件,其中所有变量都已展开

答案2

经过几个小时的搜索,我发现了这个(在寻找 AWK 使用示例时),使用 sed 将 Windows 路径替换为数字

在一个评论我看到了以下内容:

sed -i 's^<customTag>C:\\path\\to\\'${OLD_VER}'</customTag>^<customTag>C:\\path\\to\\'${NEW_VER}'</customTag>^g' test.txt

我用这些命令解决了:

sed -i "s/[.].*//" "./Datos/config/mupen64plus-qt.conf"
sed -i "s/[:/].*//" "./Datos/config/mupen64plus-qt.conf"

sed -i 's^mupen64plus='${VIEJO}'^mupen64plus='${PWD}'/'${EJECUTABLE}'^g' ./Datos/config/mupen64plus-qt.conf #Especifica el binario ejecutable que se utilizara
sed -i 's^config='${VIEJO}'^config='${PWD}'/'Datos/config'^g' ./Datos/config/mupen64plus-qt.conf
sed -i 's^data='${VIEJO}'^data='${PWD}'/'Datos/config'^g' ./Datos/config/mupen64plus-qt.conf
sed -i 's^plugins='${VIEJO}'^plugins='${PWD}'/'.libs/64Bits/plugin'^g' ./Datos/config/mupen64plus-qt.conf
sed -i 's^roms='${VIEJO}'^roms='${PWD}'/'roms'^g' ./Datos/config/mupen64plus-qt.conf

相关内容