regex - 使用 sed 和 bash 注释掉一个文件中匹配行的文件路径

标签 regex bash awk sed

我有一个包含以下内容的文件 (names.txt):

/bin/pgawk
/bin/zsh
/dev/cua0
/dev/initctl
/root/.Xresources
/root/.esd_auth

...等等。我想逐行读取此文件,并使用 sed 注释掉另一个文件中的匹配项。我有下面的代码,但它什么也没做:

#/bin/bash
while read line
do
        name=$line
        sed -e '/\<$name\>/s/^/#/' config.conf
done < names.txt

需要在 config.conf 文件中注释掉输入文件中的行。如下:

config {
    #/bin/pgawk
    #/bin/zsh
    #/dev/cua0
    #/dev/initctl
    #/root/.Xresources
    #/root/.esd_auth
}

我不想手动执行此操作,因为该文件包含超过 300 个文件路径。有人可以帮我解决这个问题吗?

最佳答案

您需要在 sed 命令周围使用双引号,否则 shell 变量将不会被扩展。试试这个:

sed "/\<$name\>/s/^/#/" config.conf

但是,我建议您完全跳过 bash for 循环并使用 awk 一次性完成所有事情:

awk 'NR==FNR{a[$0];next}{for(i=1;i<=NF;++i)if($i in a)$i="#"$i}1' names.txt config.conf

awk 命令将所有文件名存储为数组 a 中的键,然后遍历配置文件每一行中的每个单词,如果是,则在单词前添加“#”在数组中。末尾的 1 表示打印每一行。

这里最好不要使用正则表达式匹配,因为你的文件名中的一些字符(比如.)会被正则表达式引擎解释。这种方法进行简单的字符串匹配,从而避免了这个问题。

关于regex - 使用 sed 和 bash 注释掉一个文件中匹配行的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29252090/

相关文章:

linux - 词频和-gt

html - 通过 bash 从 html 中提取信息

c# - 用于精确匹配 N 数的正则表达式

php - 正则表达式:提取并匹配两个字符之间的特定单词

python:从html获取图像链接

javascript - RegExp 括号未捕获

bash - 为什么使用 kill -0 (<jobspec>|pid) 会得到不同的结果

linux - 使用 vmstat 时没有通过管道写入任何内容

string - 变量插值期间的 bash 行连接

bash - 如何在 bash 文件中特定行的末尾附加一个字符串