如何在文本块的每一行前面添加#?

如何在文本块的每一行前面添加#?

这是我的 PHP Myadmin 配置文件的一部分:

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>

我想#在每行前面添加从第一行开始<Directory>直到</Directory>.我怎样才能做到这一点?

答案1

使用 vim 有不止一种方法可以做到这一点:

1 - 视觉选择

Mikhail Krutov 关于视觉选择的评论的更详细解释:

  • /Directory找到第一个匹配项
  • Shift+ v(视觉模式)
  • /Directory>选择全部(选择直到找到Directory>
    • 您还可以点击}两次来选择 2 个段落,而不是使用搜索。
  • :'<,'>s/^/#/g将所有“行首字符”替换为 #
    • :'<,'>当你输入 时, Vim 可能会自动完成:,因为它知道你想对你的选择做一些事情。

2 - 视觉块选择

正如 DopeGhoti 和 lgeorget 评论的那样:

  • 点击Control+v进行视觉块选择
  • 击中}两次
  • 按下I#并点击Esc

3 - 宏

另一种方法是使用宏。唯一需要注意的是,您需要知道录制宏后需要重复多少次(set nu您的朋友可以帮助您在心里数行数):

  • qq- 开始录制名为 q 的宏
  • I#- 在行首插入字符#。点击Esc退出插入模式
  • jq向下一行并停止录制
  • 17@q执行此宏 17 次。

答案2

使用 Perl,就像这样简单:

perl -pe 'if ((/<Directory/ && !$done) ... /<\/Directory/) { $done = true; s/^/#/; }' < config_file

诀窍是三点运算符(只要 和<Directory> 不在</Directory>同一行,两点运算符也可以工作)。

  • /<Directory/ ... /<\/Directory/匹配这两个正则表达式之间的所有行。
  • /<Directory/ && !$done$done = true;块中的with ($done默认情况下最初为 false)确保仅<Directory>匹配第一个块。
  • -pe$_执行代码块后 逐行读取标准输入并输出。
  • s/^/#/修改与 prepend 匹配的每一行#

相关内容