【问题标题】:Using sed over SSH to remove text from file using regular expression使用 sed over SSH 使用正则表达式从文件中删除文本
【发布时间】:2020-09-01 02:27:34
【问题描述】:

我正在尝试通过 SSH 使用 sed 命令从文件中删除文本。命令是:

sed -i -r '/(\#\#Some\ text\ domain\.com\ some\ text)((.*?(\n))+.*?)(\#\#Some\ text\ domain\.com\ some\ text)/d' file

文件中有以下文字:

##Some text domain.com some text
                <IfModule mod_expires.c>
                ExpiresActive On
                ExpiresByType image/jpg "access 1 month"
                ExpiresByType image/jpeg "access 1 month"
                ExpiresByType image/gif "access 1 month"
                ExpiresByType image/png "access 1 month"
                ExpiresByType image/svg "access 1 month"
                ExpiresByType text/css "access 1 month"
                ExpiresByType text/html "access 1 month"
                ExpiresByType application/pdf "access 1 month"
                ExpiresByType text/x-javascript "access 1 month"
                ExpiresByType text/javascript "access 1 month"
                ExpiresByType application/javascript "access 1 month"
                ExpiresByType application/xhtml+xml "access 1 month"
                ExpiresByType application/x-shockwave-flash "access 1 month"
                ExpiresByType image/x-icon "access 1 month"
                ExpiresDefault "access 1 month"
                </IfModule>

               <ifModule mod_headers.c>
                  <filesMatch ".(css|jpg|jpeg|png|gif|swf|svg|js|ico)$">
                    Header set Cache-Control "max-age=2592000, public"
                 </filesMatch>
                  <filesMatch ".(x?html?|php)$">
                    Header set Cache-Control "private, must-revalidate"
                 </filesMatch>
                </ifModule>

                <IfModule mod_deflate.c>
                  # Compress HTML, CSS, JavaScript, Text, XML and fonts
                  AddOutputFilterByType DEFLATE application/javascript
                  AddOutputFilterByType DEFLATE application/json
                  AddOutputFilterByType DEFLATE application/atom+xml
                  AddOutputFilterByType DEFLATE application/rdf+xml
                  AddOutputFilterByType DEFLATE application/rss+xml
                  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
                  AddOutputFilterByType DEFLATE application/x-font
                  AddOutputFilterByType DEFLATE application/x-font-opentype
                  AddOutputFilterByType DEFLATE application/x-font-otf
                  AddOutputFilterByType DEFLATE application/x-font-truetype
                  AddOutputFilterByType DEFLATE application/x-font-ttf
                  AddOutputFilterByType DEFLATE application/x-font-woff
                  AddOutputFilterByType DEFLATE application/x-javascript
                  AddOutputFilterByType DEFLATE application/xhtml+xml
                  AddOutputFilterByType DEFLATE application/xml
                  AddOutputFilterByType DEFLATE font/opentype
                  AddOutputFilterByType DEFLATE font/otf
                  AddOutputFilterByType DEFLATE font/truetype
                  AddOutputFilterByType DEFLATE font/ttf
                  AddOutputFilterByType DEFLATE image/svg+xml
                  AddOutputFilterByType DEFLATE image/x-icon
                  AddOutputFilterByType DEFLATE text/css
                  AddOutputFilterByType DEFLATE text/html
                  AddOutputFilterByType DEFLATE text/javascript
                  AddOutputFilterByType DEFLATE text/plain
                  AddOutputFilterByType DEFLATE text/xml
                </IfModule>
                ##Some text domain.com some text

我已经使用下一个工具来验证我的正常表达:

https://regex101.com/

并确认同样有效,因此我猜问题出在 sed 命令中。任何想法都非常感谢!

提前谢谢你:)

【问题讨论】:

  • 服务器使用的是什么版本的 sed? gnu-sed?
  • 嘿,我已经使用“sed --version”检查了 sed 版本,同样的输出是:GNU sed 版本 4.2.1 版权所有 (C) 2009 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;在法律允许的范围内,甚至不用于适销性或特定用途的适用性。 GNU sed 主页:gnu.org/software/sed>。使用 GNU 软件的一般帮助:gnu.org/gethelp>。将错误报告通过电子邮件发送至:。请务必包含单词sed'' somewhere in the Subject:'' 字段。
  • 如何通过 SSH 调用它?您是否登录到服务器并以交互方式发出命令?
  • Sed 不支持.*? 非贪婪匹配。这是一个 Perl 扩展。
  • 从问题标题看来,您正在尝试做ssh user@host sed -i -r 'cmds'。请注意,如果您这样做,引号将被删除两次。

标签: regex bash ssh sed


【解决方案1】:

由于您编写了符合 PCRE/Perl 标准的有效表达式,请将其与 perl 一起使用:

perl -0777 -i 's/(\#\#Some\ text\ domain\.com\ some\ text)((.*?(\n))+.*?)(\#\#Some\ text\ domain\.com\ some\ text)//g' file

也就是说,-0777 会将文件转换为单个文本,其中换行符可以与正则表达式模式匹配,-i 将进行内联更改,s/ 中的s 表示 替换,该模式是您从 regex101.com 获得的工作模式,替换模式为空。 g 表示替换所有匹配项。

【讨论】:

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