【问题标题】:Insert a text before slash "/" character in bash scripts在 bash 脚本中的斜线“/”字符之前插入文本
【发布时间】:2017-10-03 08:05:55
【问题描述】:

我在文件中有一行如下:

2 14 * * * /run/opt/server/autoi.sh

我想在 /run/opt/server/autoi.sh 之前插入“root”,如下所示:

2 14 * * * root /run/opt/server/autoi.sh

我试过下面的命令

sed '//run/i root' filename

但它给出了以下错误:

sed: -e expression #1, char 0: no previous regular expression

你能帮我找到解决办法吗?

【问题讨论】:

  • \ 和换行符以外的任何字符都可以用作分隔符...并且i 命令会在匹配行之前添加一行,不知道您为什么使用它...

标签: regex linux bash shell sed


【解决方案1】:

使用不同的分隔符,需要使用s命令进行替换,例如:

sed 's@/run@root /run@' filename

或不重复/run:

sed 's@/run@root &@' filename

【讨论】:

  • @Sundeep 你是对的,添加了你的建议。如果它足够短,我通常会重复匹配(也就是说,如果我输入的时间比记住特殊字符的时间要少......)
【解决方案2】:

您使用了错误的sed 命令。 i 命令将在匹配行之前插入一个新行,当然,//run 根本不是一个有效的正则表达式。

sed 命令的一般形式是

<address> <action>

其中 address 可以是正则表达式或行号,而 action 是命令。

实际上,您想要一个没有地址的操作,这意味着它将应用于每个输入行;并且您要执行的操作是替换。

sed 's%/run%root &%' filename

我们使用&amp; 方便的速记来重复匹配第一个正则表达式的字符串,并使用备用正则表达式分隔符而不是/,以便/ 本身不会被解释为正则表达式分隔符(等效地,您可以反斜杠转义它,但在这里,这会产生一种叫做leaning toothpick syndrome).

这会将结果打印到标准输出,而不是修改文件。一旦你确认你得到了你想要的结果,你可能想要添加一个-i 选项来修改输入文件。 (在某些平台上,例如 *BSD——包括 MacOS——你需要 -i '' 和一个空参数。)

【讨论】:

    【解决方案3】:

    只需将第一个 / 替换为 root /,如下所示。

    sed 's/\//root \//'  Input_file
    

    【讨论】:

    • @down voter:请在此处对 -ve 投票做出解释,因为这让我感到沮丧,因为我不知道有人在为我的回答提供 -ve :(
    【解决方案4】:
    sed -e 's/run/root\/run/' abc
    

    例子:

    [root@myIP tmp]# cat abc 
    2 14 * * * /run/opt/server/autoi.sh
    [root@myIP tmp]# sed -e 's/run/root\/run/' abc
    2 14 * * * /root/run/opt/server/autoi.sh
    

    已编辑:添加用户名。这应该可以解决问题

    [root@myIP tmp]# sed -e 's/\//root \//' abc
    2 14 * * * root /run/opt/server/autoi.sh
    

    【讨论】:

    • 目的是在命令前添加用户名,而不是在路径中添加东西。 root 用户的 crontab 格式不同,需要在五个时间规范字段之后,在命令运行之前有一个用户名字段。
    猜你喜欢
    • 2022-07-08
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多