regex - sed(或awk)正则表达式来替换匹配的子字符串

标签 regex sed awk

我有一个包含以下内容的文本文件(“file.txt”):

#   disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

我需要使用 GNU Sed 切换这 3 行中的哪一行(“有利”、“基本”或“不利”)被注释掉。

我知道我可以用如下代码匹配“有利”行(作为一个虚拟示例,我只是将文本替换为“aaa”):

$ cat file.txt | sed -r 's/#[\t]disutil_screening[\ =0-9\.;]+# favorable/aaa/'
aaa
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

但是,这个示例 Sed 语句显然与我实际想要的相去甚远。我需要一个只会删除前导“#”的 Sed 表达式。也就是说,我需要一个 Sed 表达式 ($EXPR),以便按以下方式修改如上所示的“file.txt”的内容:

$ cat file.txt | sed -r $EXPR
    disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

一旦我知道如何执行此操作(将“有利”行的前导“#”替换为“”),那么我相信我可以弄清楚如何将“#”添加到“基本”行(即注释掉当前未注释掉的行)。

注意:我对使用 awk 而不是 sed 来完成这项任务持开放态度,但我对 awk 有点害怕,因为我以前从未使用过它。

最佳答案

我认为您需要的是分组。试试这个:

$ cat file.txt | sed -r 's/#([\t]disutil_screening[\ =0-9\.;]+# favorable)/\1/'

我将除第一个评论字符之外的所有匹配项包装到组中,然后用该组替换整个匹配项,以便删除第一个字符。

关于regex - sed(或awk)正则表达式来替换匹配的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14762196/

相关文章:

linux - GREP 或 AWK 复杂模式匹配 (linux)

bash - 在 bash 中最后一次出现字符串后插入新行

javascript - 如何在 Angular 中正确添加额外验证指令?

python - 重复序列的正则表达式

regex - sed 命令仅在 unix 中的最后一行添加文本

bash - 将一个文件中的字符串替换为第二个文件的内容

ruby - 如何将 Ruby 正则表达式转换为 PCRE

python - 列表/序列的正则表达式模拟

bash - 有选择地从 'iptables -nvL' 命令输出中删除不必要的列空格吗?

awk - 匹配特定列的 grep 文件