当前位置: 首页 > 面试题库 >

Perl命令行多行替换

公孙联
2023-03-14
问题内容

我正在尝试使用命令行perl替换多行文件中的文本。我正在使用Ubuntu Natty。

以下是我的文本文件(称为test.txt)的内容:

[mysqld]
#
# * Basic Settings
#

#
# * IMPORTANT
#   If you make changes to these settings and your system uses apparmor, you may
#   also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#

user            = mysql
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
skip-external-locking

以下是我的perl命令:

perl -i -pe "s/(\[mysqld\][^\^]+)/\1\nsometext/g" test.txt

但是,下面是我最终得到的结果,而不是替换文件中的所有文本:

[mysqld]

sometext#
# * Basic Settings
#

#
# * IMPORTANT
#   If you make changes to these settings and your system uses apparmor, you may
#   also need to also adjust /etc/apparmor.d/usr.sbin.mysqld.
#

user            = mysql
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
skip-external-locking
#

我在RegexBuddy中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。

我将不胜感激。

提前致谢。


问题答案:

您正在逐行读取文件,因此只有第一行与您的正则表达式匹配。如果您确实要删除大部分内容,那么您想要做的就是通过使用-0选项(例如)对文件进行处理-0777。这是行尾处理,777只是常规上用作八进制数的数字,该数字足够大以致于引起文件拖尾现象。

perl -0777 -i -pe 's/(\[mysqld\][^\^]+)/$1\nsometext/g' test.txt

另外,我替换了您的报价。如果您似乎在* nix中,则最好使用单引号。举例来说,$1shell不会插值。



 类似资料:
  • 问题内容: 我有一个文件,其中我必须替换所有单词,如$ xyz,对于它们,我必须替换为以下内容: 这个文件也有一些像$ {abcd}这样的词,我不必更改。我正在使用此命令 sed -i’s?\ $([A-Z _] +)?\ $ {\ 1}?g’文件 它可以在命令行上正常工作,但不能在perl脚本中作为 ; 我想念什么?我认为添加一些反斜杠会有所帮助。我尝试添加一些但没有成功。 谢谢 问题答案: 在

  • 全局配置 你可以获得命令行帮助通过pyspider --help和pyspider all --help来获得帮助。 全局的选项适用于所有的子命令 ``` Usage: pyspider [OPTIONS] COMMAND [ARGS]... A powerful spider system in python. Options: -c, --config FILENAME

  • 问题内容: 我试图在一行中合并多个Linux命令以执行部署操作。例如 问题答案: 如果仅在上一个命令成功的情况下才执行每个命令,请使用运算符将它们组合: 如果其中一个命令失败,则将不执行其后的所有其他命令。 如果要执行所有命令而不管先前的命令是否失败,请使用分号将它们分开: 在您的情况下,我想您希望第一种情况下,下一条命令的执行取决于上一条命令的成功。 您还可以将所有命令放在脚本中,然后执行该脚本

  • 问题内容: 我正在使用Python执行单线循环,即: 这很好。但是,如果我在for循环之前导入模块,则会收到语法错误: 任何想法如何解决? 对我来说,将其作为一个单行放置非常重要,这样我才能将其包含在Makefile中。 问题答案: 你可以做 或不带管道: 要么 或@ SilentGhost的答案 只需使用return并在下一行输入它:

  • 问题内容: 我正在尝试在Linux机器上搜索和替换grep匹配的所有文件中的字符串。我已经做了一些想做的事情,但是我不确定如何将它们全部串在一起。 将以以下形式给我输出: 对于grep返回的每个文件,我想将“ foo”替换为“ bar”,然后将结果写回到文件中。有什么好办法吗?也许花哨的管道? 问题答案: 您的意思是搜索并替换所有与grep匹配的文件中的字符串吗? 编辑 由于这似乎是一个很受欢迎的

  • 本文向大家介绍Perl学习教程之单行命令详解,包括了Perl学习教程之单行命令详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于Perl单行命令的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 与One-Liner相关的perl参数 -a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $ -F 指定-a的分隔符 -l