【问题标题】:Using sed with regex to remove text from a file使用 sed 和正则表达式从文件中删除文本
【发布时间】:2021-04-18 09:34:38
【问题描述】:

我正在尝试使用 sed 和正则表达式从文件中删除特定模式。 这是我正在使用的命令:

sed '/location .*?\/\s+{(?:[\w\W]+?)}\s*(?=(?:location|$))/d'

这是我正在测试的示例文本:

location / {
                try_files $uri $uri/ /index.php?$args;
}
location ~*  .(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 365d;
        }

        location ~*  .(pdf)$ {
            expires 30d;
        }

        location ~ \.php$
                {
                        try_files $uri =404;
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        include /etc/nginx/fastcgi_params;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        include /etc/nginx/nginx_limits.conf;
                        if (-f $request_filename)
                        {
                                fastcgi_pass unix:/usr/local/php73/sockets/rgeoipdsm1.sock;
                        }
                }
        location ~ / {
                        try_files $uri $uri/ /index.php?$args;
        }

        location ^ / {
                        try_files $uri $uri/ /index.php?$args;
        }

        location ~ / {
                        if (-f $request_filename)
                        {
                                fastcgi_pass unix:/usr/local/php73/sockets/rgeoipdsm1.sock;
                        }
                        try_files $uri $uri/ /index.php?$args;
        }

location ~ \.png {

}

location ~ / {
}

运行 sed 后我期望看到的内容:

location ~*  .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }
    
    location ~*  .(pdf)$ {
        expires 30d;
    }

        location ~ \.php$
                {
                        try_files $uri =404;
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        include /etc/nginx/fastcgi_params;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                        include /etc/nginx/nginx_limits.conf;
                        if (-f $request_filename)
                        {
                                fastcgi_pass unix:/usr/local/php73/sockets/rgeoipdsm1.sock;
                        }
                }
    location ~ \.png {

}

但是在运行 sed 之后我没有得到任何改变,它似乎什么都不匹配。 是否可以微调此命令(可能使用转义字符?)以便删除所需的模式?

【问题讨论】:

  • 试试sed '/^[[:blank:]]*location .*\/[[:blank:]]*{[[:blank:]]*$/,/^[[:blank:]]*}[[:blank:]]*$/d' yourfile > newfile

标签: regex sed


【解决方案1】:

这可能对你有用(GNU sed):

sed -E '/location ([~^] )?\/ \{/{:a;N;/^(\s*)location.*\n\1\}\s*$/d;ba}' file

匹配所需的location,然后追加行,直到结束} 之前的空白与开始行的初始空白匹配并删除这些行。

【讨论】:

    【解决方案2】:

    你可以使用

    sed '/^[[:blank:]]*location .*\/[[:blank:]]*{[[:blank:]]*$/,/^[[:blank:]]*}[[:blank:]]*$/d' yourfile > newfile
    

    此 sed 命令在匹配 ^[[:blank:]]*location .*\/[[:blank:]]*{[[:blank:]]*$ 的行和匹配 ^[[:blank:]]*}[[:blank:]]*$ 的行之间查找行块,并删除它们(使用 d)。

    ^[[:blank:]]*location .*\/[[:blank:]]*{[[:blank:]]*$ 正则表达式匹配

    • ^ - 字符串开头
    • [[:blank:]]* - 零个或多个空格/制表符
    • location - location 字符串
    • .* - 任何零个或多个字符
    • \/ - 一个 / 字符
    • [[:blank:]]*{[[:blank:]]* - 一个 `{~ 包含零个或多个空格/制表符
    • $ - 字符串结束。

    ^[[:blank:]]*}[[:blank:]]*$ 正则表达式匹配一个字符串,该字符串仅包含一个 } 字符,并带有可选的空格/制表符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多