使用sed将条件字符串附加到文件

时间:2017-09-13 14:08:15

标签: bash sed centos

如果需要,我必须创建一个查看/etc/gdm/Xsession并添加-a ! -x "$HOME/.xsession"的脚本。

1)我想检查文件是否已包含添加的部分。 使用grep,我尝试了这个:

if ! grep -q '-a ! -x "$HOME/.xsession"' "$xsessionScript"

当grep尝试解释简单引号之间的所有内容时,它不起作用。

2)如果我发现该文件未被修改,我想将-a ! -x "$HOME/.xsession"附加到if语句: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
[...]

2 个答案:

答案 0 :(得分: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是否发现了什么;如果它没有回声将文本附加到Xsession文件

如果您可以在执行脚本后添加Xsession外观以及预期效果的示例,我可以尝试给您一个示例。

更新:试试这个

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

答案 1 :(得分: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. 相同
  3. s|($main)($appendix)?| - 意思是:模式必须包含$main部分,但$appendix部分是可选的。 $appendix可以存在,也可以不存在。
  4. |\1$appendix| - 将模式替换为$main(为简洁起见,我使用\1捕获组而不是$main变量)+ $ appendix。
  5. 所以,我们得到了理想的行为:

    • 如果行只包含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
    [...]