【问题标题】:Extracting all lines from a file that are not commented out in a shell script从文件中提取未在 shell 脚本中注释掉的所有行
【发布时间】:2011-08-26 05:40:58
【问题描述】:

我正在尝试从某些不以 # 开头的文件中提取行(已注释掉)。我将如何运行文件,忽略前面带有 # 的所有内容,但将不以 # 开头的每一行复制到不同的文件中。

谢谢

【问题讨论】:

    标签: shell


    【解决方案1】:

    更简单:grep -v '^[[:space:]]*#' input.txt > output.txt

    【讨论】:

    • 这个很好用,我用的是:cat file1.txt | sed -e '/\s*\#/d' > file2.txt
    • @Danny,这将删除任何带有散列的行,包括如下行:echo "this line # has a hash"。您需要将模式锚定到行的开头。还有,猫没用。试试这个:sed -e '/^\s*#/d' file1.txt > file2.txt
    • @Glenn,直到哈希标记之前有任何空格为止。如果某些内容被标记并评论,它不会删除该行。有什么想法吗?
    • @Danny,你运行的是什么版本的 grep:grep --version
    • @Danny,不知道,对我有用:删除行首带有空格或制表符的行,后跟哈希。尝试通过od -c 运行您的输入,以查看[[:space:]]* 正则表达式不匹配的违规字符。
    【解决方案2】:

    这假设您正在使用 Unix/Linux shell 和可用的 Unix 命令工具包,并且您希望保留原始文件的副本。

    cp file file.orig
    mv file file.fix
    sed '/^[      ]*#/d' file.fix > file
    rm file.fix
    

    或者,如果你有一个漂亮闪亮的新 GNU sed,所有这些都可以概括为

    cp file file.orig
    sed -i '/^[      ]*#/d' file
    

    在这两种情况下,sed 命令中的正则表达式都是[spaceCharTabChar] 所以你说,删除任何以(可选空格或制表符)#开头的行,但打印其他所有内容。

    我希望这会有所帮助。

    【讨论】:

    • grep -v '^/[ ]*#/' file 简单一点。
    • grep -v 也可以。此外,许多 seds 支持 @pulsar 提倡的 [[:space:]] 语法,因此请先尝试替换它。
    【解决方案3】:
    grep -v ^\# file > newfile
    grep -v ^\# file | grep -v ^$ > newfile
    

    不是花哨的正则表达式,但我将此方法提供给 Jr. Admins,因为它有助于理解管道和重定向。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 2013-08-23
      • 2017-06-02
      • 2015-08-16
      • 1970-01-01
      • 2011-09-08
      • 2010-10-31
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多