regex - 使用 sed 和正则表达式从文件中删除文本
问题描述
我正在尝试使用 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 之后,我根本没有得到任何改变,它似乎什么都不匹配。是否可以微调此命令(可能使用转义字符?)以便删除所需的模式?
解决方案
这可能对您有用(GNU sed):
sed -E '/location ([~^] )?\/ \{/{:a;N;/^(\s*)location.*\n\1\}\s*$/d;ba}' file
匹配location
所需的行,然后追加行,直到关闭之前的空白}
与开头的行初始空白匹配,然后删除这些行。
推荐阅读
- xml - 如何使用 XSLT 连接多个 XML 文件?
- c# - 打印文本文件中匹配单词后的行 (C#)
- c# - Windows XP .NET Framework 4.0 中 WPF xaml 中的异常
- r - rmarkdown 期刊文章模板
- android - 如何将回收器高度设置为 recyclerView 中的最高项目?
- javascript - 剑道的层次图
- mysql - 尝试更新现有记录 - 出现错误
- c# - 如何在服务器端设置没有 id 属性的 Input 元素的值?
- apache-spark - 如何在不使用 sparkListener 操作的情况下为不同的数据帧写入记录计数?
- node.js - 无法在启用了 Istio 的 GKE 集群中的 2 个节点、js 应用程序之间进行通信