bash中的sed无法产生预期的行为

时间:2019-06-06 16:11:24

标签: linux bash sed

当我做一些SDR项目,但又想在计算机上看电视时,当我想使用SDR时,我需要一个脚本来注释modprobe中文件中的黑名单行,而当我需要对这些行进行注释时,我想看电视。

所以我基于互联网上的多次阅读来编写脚本,但不幸的是,它在我的机器上不起作用。 希望您能帮助我修复它。

请注意,单个sed命令确实可以正常工作(使用简单引号,如bash中一样,我们需要双引号)

#!/bin/bash
# your target file
FILE="/etc/modprobe.d/blacklist-dvb.conf"

# comment target
comment() {
    sed -i "s/^/#/g" $FILE # comment all lines
}

# uncomment target
uncomment() {
    sed -i "s/^#//g" $FILE
}

然后我将脚本启动为:./my_script.sh注释(或取消注释,视情况而定)

2 个答案:

答案 0 :(得分:3)

主要问题是您的脚本实际上没有执行任何操作。它定义了一个变量和两个函数,然后退出。

如果您希望脚本检查命令行参数并调用相应的函数,则必须手动执行。

例如:

case "${1:?missing command argument}" in
  comment)   comment;;
  uncomment) uncomment;;
  *)         echo "$0: bad command: $1" >&2; exit 1;;
esac

其他说明:

  • 请勿将ALL_UPPERCASE用于您的shell变量。按照惯例,这些保留给系统和外壳本身使用。更好:

    file="/etc/modprobe.d/blacklist-dvb.conf"
    
  • 通常,除非您真的知道自己在做什么,否则应该用引号("$file"括起来。

  • 您的正则表达式锚定在字符串(^)的开头。 /g标志是毫无意义的。

  • 通常,使用单引号比使用双引号更好。 '...'带来的惊喜更少,因为一切都是按字面意义进行的:

    sed -i 's/^/#/' "$file"
    

    sed -i 's/^#//' "$file"
    

答案 1 :(得分:0)

好的,因为我无法在bash中运行它,所以我使用了python,它可以完美地完成工作:)

对于需要帮助的其他人,这是我的脚本:

#!/usr/bin/python
import subprocess
import sys



def comment():
    subprocess.call(["sed -i 's/^/#/g' /etc/modprobe.d/blacklist-dvb.conf"], shell=True)

def uncomment():
    subprocess.call(["sed -i 's/^#//g' /etc/modprobe.d/blacklist-dvb.conf"], shell=True)

# Print 
print("Script name ", sys.argv[0])
print("Argument 1 ", sys.argv[1])

argument_1 = sys.argv[1]
if argument_1 == "comment":
   print("in comment")
   comment()
elif argument_1 =="uncomment":
   uncomment()
else:
   print("usage = python switcher.py comment")