使用sed将一系列条件字符串附加到文件中

3
我需要制作一个脚本,它查看/etc/gdm/Xsession并在需要时添加-a ! -x "$HOME/.xsession"
1)我想检查文件是否已经包含了添加的部分。使用grep,我尝试了这个:
if ! grep -q '-a ! -x "$HOME/.xsession"' "$xsessionScript"

该命令不能正常工作,因为grep试图解释单引号之间的所有内容。

2) 如果我发现文件未被修改,我想在if语句中追加-a ! -x "$HOME/.xsession": if [ "$1" != "default" -a "$1" != "custom" ],使其变成:

if [ "$1" != "default" -a "$1" != "custom" -a ! -x "$HOME/.xsession" ]

我尝试使用sed进行操作:

sed -i.bck '/\"$1" != "default" -a "\$1" != "custom"/a  -a ! -x "$HOME/.xsession"'

但是这将会创建一个新行而不是将字符串添加在“custom”之后。

请帮帮我!

非常感谢 :)

顺便提一句,我使用的是CentOs 6.6.1,sed 4.2.1,bash 4.1.2

编辑:

我想要编辑的文件长这样:

[...]
case $# in
    [...]
    case "$1" in
    [...]
    *)
        if [ "$1" != "default" -a "$1" != "custom" ]; then # I want this line to become:
====> # if [ "$1" != "default" -a "$1" != "custom" -a ! -x "$HOME/.xsession" ]
        exec $CK_XINIT_SESSION $SSH_AGENT /bin/sh -c "exec -l $SHELL -c \"$1\""
        fi
        ;;
    esac
esac
fi
[...]

1
我没有完全理解...但我认为grep -Fq是你要找的吗?如果你能提供两个输入样本和期望输出,那会更有帮助...一个需要添加,一个不需要修改。 - Sundeep
嗨@Sundeep,我添加了文件的一部分。感谢你的帮助。 - Hubert Chauvat
2个回答

0
#!/bin/bash

# I use variables for clarity
main='"\$1" != "default" -a "\$1" != "custom" '
appendix='-a ! -x "\$HOME/.xsession" '

sed -i.bck -r "s|($main)($appendix)?|\1$appendix|" input.txt

解释

  1. sed 's|||' 结构与 sed 's///' 相同。
  2. s|($main)($appendix)?| - 意思是:模式必须包含 $main 部分,但 $appendix 部分是可选的。 $appendix 可以存在也可以不存在。
  3. |\1$appendix| - 将模式替换为 $main(我使用 \1 捕获组代替 $main 变量,以简洁明了)+ $appendix。

因此,我们得到了期望的行为:

  • 如果行仅包含 main 部分,则将其替换为 main + appendix
  • 如果该行已经包含 main + appendix,则将其替换为相同内容。换句话说,它保持不变。

测试

输入

[...]
case $# in
    [...]
    case "$1" in
    [...]
    *)
        if [ "$1" != "default" -a "$1" != "custom" ]; then
        exec $CK_XINIT_SESSION $SSH_AGENT /bin/sh -c "exec -l $SHELL -c \"$1\""
        fi
        ;;
    esac
esac
fi
[...]

输出

[...]
case $# in
    [...]
    case "$1" in
    [...]
    *)
        if [ "$1" != "default" -a "$1" != "custom" -a ! -x "$HOME/.xsession" ]; then
        exec $CK_XINIT_SESSION $SSH_AGENT /bin/sh -c "exec -l $SHELL -c \"$1\""
        fi
        ;;
    esac
esac
fi
[...]

太棒了!非常感谢! - Hubert Chauvat

0

您可以使用grep 'a | -x "$HOME/.xsession"' file.sh > /dev/null来检查它是否包含此测试。如果没有,grep将返回1。

if [ "$?" -eq 1 ]; then echo '-a ! -x "$HOME/.xsession"' >> /etc/gdm/Xsession就可以了。

如果if检查到grep没有找到任何内容,则echo将把文本附加到Xsession文件中。

如果您可以添加一个Xsession的样本以及在执行脚本后期望它看起来像什么的示例,我可以尝试为您提供一个示例。

更新:请尝试这个

if [ "$1" != "default" -a "$1" != "custom" -a ! $(grep 'a | -x "$HOME/.xsession"' "$xsessionScript")]


感谢grep部分。但是对于字符串的插入,我不想将其附加到文件末尾,而是在“if”语句内部插入(请参见更新的原始帖子)。 - Hubert Chauvat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接