Linux下快速批量替换文本

Linux下快速批量替换文本

有一批配置文件,名字以4xxxvf开头,以dev0,dev1,dev2结尾,形式上例如:4xxxvf_dev0.conf, 4xxxvf_dev1.conf, 一共有100个左右的文件,这些文件中内容绝大部分相同,现在需要把文件中的某一处修改——有一行是

ServicesEnabled=sym

修改为

ServicesEnabled=asym

一共100个文件,如果手动添加,时间耗费非常大,因此必须编写脚本批量修改。

perl命令行

Perl语言非常适合进行文本处理。Perl可以使用命令行快速批量处理文本。并且perl是所有Linux中默认安装的。

# perl -i -e "s/Old/new/g" file1 file2 file3 file4 file5

Perl参数:

Usage: perl [switches] [--] [programfile] [arguments]
  -0[octal]         specify record separator (\0, if no argument)
  -a                autosplit mode with -n or -p (splits $_ into @F)
  -C[number/list]   enables the listed Unicode features
  -c                check syntax only (runs BEGIN and CHECK blocks)
  -d[:debugger]     run program under debugger
  -D[number/list]   set debugging flags (argument is a bit mask or alphabets)
  -e program        one line of program (several -e's allowed, omit programfile)
  -E program        like -e, but enables all optional features
  -f                don't do $sitelib/sitecustomize.pl at startup
  -F/pattern/       split() pattern for -a switch (//'s are optional)
  -i[extension]     edit <> files in place (makes backup if extension supplied)
  -Idirectory       specify @INC/#include directory (several -I's allowed)
  -l[octal]         enable line ending processing, specifies line terminator
  -[mM][-]module    execute "use/no module..." before executing program
  -n                assume "while (<>) { ... }" loop around program
  -p                assume loop like -n but print line also, like sed
  -s                enable rudimentary parsing for switches after programfile
  -S                look for programfile using PATH environment variable
  -t                enable tainting warnings
  -T                enable tainting checks
  -u                dump core after parsing program
  -U                allow unsafe operations
  -v                print version, patchlevel and license
  -V[:variable]     print configuration summary (or a single Config.pm variable)
  -w                enable many useful warnings
  -W                enable all warnings
  -x[directory]     ignore text before #!perl line (optionally cd to directory)
  -X                disable all warnings

-e代表采用perl命令行。

-i 代表在原文件中编辑。

-p 非常重要,-p是-n的超集,对每一读入的行在经过表达书操作后都会输出。-p -i 结合在一起才会修改原来的文件。

参考 https://zhuanlan.zhihu.com/p/161566950

因此可以执行如下指令:

perl -p -i -e "s/ServicesEnabled = sym;dc/ServicesEnabled = asym;dc/g" 4xxxvf_dev*.conf

sed命令行

sed+awk也可以处理Linux中绝大部分的文本和表格。

sed -i "s/old/new/g"  files

sed的命令行参数为

Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent
                 suppress automatic printing of pattern space
  -e script, --expression=script
                 add the script to the commands to be executed
  -f script-file, --file=script-file
                 add the contents of script-file to the commands to be executed
  --follow-symlinks
                 follow symlinks when processing in place
  -i[SUFFIX], --in-place[=SUFFIX]
                 edit files in place (makes backup if SUFFIX supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
  -b, --binary
                 does nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (
                 open files in binary mode (CR+LFs are not treated specially))
  -l N, --line-length=N
                 specify the desired line-wrap length for the `l' command
  --posix
                 disable all GNU extensions.
  -E, -r, --regexp-extended
                 use extended regular expressions in the script
                 (for portability use POSIX -E).
  -s, --separate
                 consider files as separate rather than as a single,
                 continuous long stream.
      --sandbox
                 operate in sandbox mode (disable e/r/w commands).
  -u, --unbuffered
                 load minimal amounts of data from the input files and flush
                 the output buffers more often
  -z, --null-data
                 separate lines by NUL characters
  --help
                 display this help and exit
  --version
                 output version information and exit

If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret.  All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.

-i 命令的描述和perl中的一样。只不过sed不需要加-p

对批量文件的操作,如果是文件名有规则,可以像以上用4xxxvf_dev*.conf这样的正则表达式。不过,有时候,文件名未必有这些规则,你需要对不同名字的文件进行批量修改。并且这些文件中的内容也是不规则的,这怎么办?

可以结合grep指令,对当前目录或指定目录进行过滤,找出有特定词的文件。

sed -i "s/old/new/g"  `grep asym -rf ./`

对当前目录进行递归搜索,寻找任何有asym关键词的文件,并且作为文本类型的结果成为sed 的 第3个参数。

等于sed -i "s/old/new/g" 所有包含asym字符串的文件名

参考来源: [linux --批量修改文件内容](https://www.cnblogs.com/clairedandan/p/11458947.html)

Python批量替换处理

Python并未像Perl和sed那样具有方便的命令行操作,因此,需要编写Python脚本文件。

posted @   goto2091  阅读(674)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示