Shell命令行下如何查找并替换多个文件中的字符

2023-11-13

如果你在shell命令行下,需要一种能快速查找并替换多个文件里字符的方法,
那么下面这行命令你一定要记住或者收藏起来,它能帮到你的。

find . -name '*.html' -print0 | xargs -0 perl -pi -e 's/SEARCHSTRING/REPLACESTRING/g'

注解:
*.html:表示查找所在目录下的所有扩展名为html的文件;
SEARCHSTRING:要查找搜索的字符;
REPLACESTRING:替换后的字符。
记住:如果替换的字符包括 ()[]/”’!? 等等这样的特殊字符,你必须在字符前加上反斜杠\ 。
使用举例:
1.创建一个新目录:

$ mkdir test
$ cd test

2.创建1.html,2.html两个文件,并分别输入i like china :

[root@localhost test]$ vi 1.html
按i进入输入模式,输入:
i like china
按esc键退出输入模式,输入
:wq
退出。
[root@localhost test$] vi 2.html
按i进入输入模式,输入:
you like china
按esc键退出输入模式,输入
:wq
退出。

3.运行替换命令,like感情不够强烈,呵呵,我们这里要将2个文件中的字符 like 换为 love :

$ find . -name '*.html' -print0 | xargs -0 perl -pi -e 's/like/love/g'

4.检查替换结果:

$ cat 1.html
i love china
$ cat 2.html
you love china

(the end)

另附转载博文:
批量修改文件名后缀
http://linux.chinaunix.net/techdoc/develop/2005/04/15/922097.shtml
可以复习一下xargs的用法,和变量的一些高级操作技巧
如何批量把若干文件从一个扩展名改为另一个扩展名?比如把后缀gz,改为zip
答:

1.

for file in *.gz; do mv $file `basename $file .gz`.zip; done 

或(也适合ksh)

for file in *.gz; do mv $file ${file%.gz}.zip; done

2.

ls | grep gz | awk -F'.' '{print $1}'|xargs -i mv {}.gz {}.zip

附netman十三问片断:

${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt

${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt

${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt

${file##*.}:拿掉最后一个 . 及其左边的字符串:txt

${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3

${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)

${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file

${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my


记忆的方法为:

是去掉左边(在鉴盘上 # 在 $ 之左边)

% 是去掉右边(在鉴盘上 % 在 $ 之右边)

单一符号是最小匹配﹔两个符号是最大匹配。

${file:0:5}:提取最左边的 5 个字节:/dir1

${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2


我们也可以对变量值里的字符串作替换:

${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt

利用 ${ } 还可针对不同的变量状态赋值(没设定、空值、非空值):

filemy.file.txt file 没有设定,则使用 my.file.txt 作默认值。(保留空值及非空值)

file:my.file.txt file 没有设定或为空值,则使用 my.file.txt 作默认值。 (保留非空值)

file+my.file.txt file 为何值,均使用 my.file.txt 作默认值。 (不保留任何值)

file:+my.file.txt file 为非空值,则使用 my.file.txt 作传回值。 (保留没设定及空值)

file=my.file.txt file 没设定,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留空值及非空值)

file:=my.file.txt file 没设定或为空值,则使用 my.file.txt 作默认值,同时将 $file 定义为非空值。 (保留非空值)

file?my.file.txt file 没设定,则将 my.file.txt 输出至 STDERR。 (保留空值及非空值))

file:?my.file.txt file 没设定或为空值,则将 my.file.txt 输出至 STDERR。 (保留非空值)

还有哦,${#var} 可计算出变量值的长度:

${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节…

接下来,再为大家介稍一下 bash 的组数(array)处理方法。

一般而言,A=”a b c def” 这样的变量只是将 $A 替换为一个单一的字符串,

但是改为 A=(a b c def) ,则是将 $A 定义为组数…


bash 的组数替换方法可参考如下方法:

A[@] {A} 可得到 a b c def (全部组数)

A[0]a() {A[1]} 则为第二个组数…

{#A[@]} 或{#A} 可得到 4 (全部组数数量)

{#A[0]} 可得到 1 (即第一个组数(a)的长度),{#A[3]} 可得到 3 (第四个组数(def)的长度)

A[3]=xyz 则是将第四个组数重新定义为 xyz …


#/bin/bash
#i=118
for((j=110;j<146;j++))
do
   path="/home/education/$j/img"
   cd "$path"
echo `pwd`
    ls 0?.jpg > tmp.txt
    for i in `cat tmp.txt`
do
    mv $i `echo $i |cut -c 2-6`
    done
done

#/bin/bash
#i=118
for((j=86;j<146;j++))
do
   path="/home/education/$j/img"
   cd "$path"
echo `pwd`
    ls ?.jp > tmp.txt
    for i in `cat tmp.txt`
do
#    mv $i `echo $i |cut -c 2-5`
     mv $i `basename $i .jp`.jpg
    done
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell命令行下如何查找并替换多个文件中的字符 的相关文章

  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • 使用 grep 查找所有匹配的模式

    In txt1 S01A1P2 S01A1P5 S01A1P4 In txt2 data train wave S01A1P3 mfc data train wave S01A1P7 mfc data train wave S01A1P8
  • pthread_self() 返回的线程 ID 与调用 gettid(2) 返回的内核线程 ID 不同

    这句话来自于pthread self 的手册页 http linux die net man 3 pthread self 那么 我应该根据什么来决定是否应该使用pthread self or gettid确定哪个线程正在运行该函数 两者都
  • adb shell 输入带有空格的文本

    如何发送带有空格的文本 例如 一些文字 using adb shell input text 找到以下解决方案 adb shell input text some stext 工作正常 但是有什么简单的方法可以用 s 替换空格吗 Examp
  • 带有二进制数据的 Bash echo 命令?

    有人可以解释一下为什么这个脚本有时只返回十六进制字符串表示形式的 15 个字节吗 for i in 1 10 do API IV openssl rand 16 API IV HEX echo n API IV od vt x1 w16 a
  • #*/ 在 UNIX Shell 脚本中使用

    谁能详细说明 在 UNIX Shell 脚本中的工作原理 我已经看到它在 Korn Shell 中的使用 它专门用于删除文件的扩展名 例如 func write app log o 删除状态文件 CIE STATUS FILE 这里假设文件
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • sed 和 rev shell 命令转换为 Python 脚本 [重复]

    这个问题在这里已经有答案了 有一个shell命令 我正在尝试将逻辑转换为python 但我不知道该怎么办 我需要一些帮助 shell命令是这样的 cd tests src main test ls find name vrlp while
  • 通过 shell 脚本查找“非”硬链接的文件

    给定一个目录 如何找到其中的所有文件 以及任何子目录 not硬链接文件 或者更具体地说 这不是具有多个引用的硬链接文件 基本上我想扫描一个文件夹并返回一个列表unique该目录中的文件 包括目录和符号链接 不是它们的目标 如果可能的话 最好
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • Ruby 在特定目录中运行 shell 命令

    我知道如何在 Ruby 中运行 shell 命令 例如 x cmd 但是 如何指定运行此命令的目录 有没有类似的脱壳方式 类似subprocess Popen在Python中 subprocess Popen r c mytool tool
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 如何在 Ubuntu/Linux 发行版中安装 Tesseract-OCR 3.03?

    我和一个朋友有兴趣为 CV 项目训练 tesseract OCR 引擎 我们尝试使用一些包装器 例如 PyTesser 和 pyocr 但结果目前不如我们需要的那么准确 因此 我们希望尝试训练超立方体以更好地实现我们的目的 即识别食品标签上
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置

随机推荐

  • 函数模板,重载函数模板,模板的显式具体化,实例化

    目录 一 函数模板应用场景 二 函数模板 1 直白理解函数模板 函数模板就是建立一个通用的函数 其参数类型和返回类型不具体指定 用一个虚拟的类型来代表 2 函数模板的声明 3 函数模板的代码 三 重载的模板 1 为什么要使用重载模板 2 代
  • H5静态页面跳转微信小程序;从外部浏览器,点击H5链接跳转打开微信小程序;以及在微信内直接点击H5链接打开微信小程序;

    参考链接 需求 从外部浏览器 点击H5链接跳转打开微信小程序 以及在微信内直接点击H5链接打开微信小程序 步骤1 小程序开发需要使用云开发创建项目 使用云开发生成的项目会自带云函数文件夹 步骤2 项目开启云开发 步骤3 下载官方的H5静态h
  • 详解AdaBoost

    Boosting 顾名思义 这是一个增强算法 而它增强的对象 就是机器学习中我们所熟知的学习器 在Valiant引入的PAC Probably Approximately Correct 又称可能近似正确 中 学习器可被分为强学习器和弱学习
  • 虚拟机同时连接内网 (通过网线连接到开发板) 和外网 (连接至Internet) 的一种解决办法

    因为嵌入式实验需要搭建开发环境 因此需要将虚拟机通过网线连接到开发板 同时因为更新的需要 也要将虚拟机连接至Internet 所以写了一下自己的解决方法 注 我的虚拟机为VMware 装的是Linux系统 Ubuntu 目录 虚拟机同时连接
  • Visual Studio 2015开发Android App启动调试始终无法完成应用部署的解决方案

    创建一个Android App项目后 直接启动调试发现Visual Studio Emulator for Android已成功运行 但应用始终处于Build中 等待时间超过1小时 并未如预期通过adb部署到模拟器中 将应用直接导出apk
  • 机器学习算法竞赛实战--1,初见竞赛

    目录 竞赛流程 1 2 思考练习 之所以强烈推荐用竞赛作为积极学习适当的重要方式是因为他实在是一个快速入门 积极学习的极佳方式 对于初学者来说 他们的水平并不足以支撑他们直接进到企业接触实际的应用场景 而从书里得来的知识终究有些浅薄 在时代
  • 面试经典150题(1)

    文章目录 前言 除自身以外数组的乘积 要求 思路 代码 跳跃游戏 要求 题解 代码 跳跃游戏 要求 题解 代码 前言 今天开始我将陆续为大家更新面试经典150题中较难理解的题目 今天我为大家分享的是 除自身以外数组的乘积 跳跃游戏 和 跳跃
  • 实践

    CNN到ResNet Step1 准备数据 自定义数据集 Step2 网络配置 1 RESNET网络模型 2 飞桨内置网络 Step3 模型训练 方式1 基于基础API 完成模型的训练与预测 模型配置 模型验证 方式2 基于高层API 完成
  • 如何锻炼孩子的逻辑思维?编程教育是绝佳媒介

    进入人工是智能时代 数学能力和编程思维越来越受到家长们的重视 虽然绝大多数家长依旧把学习成绩和分数看得非常重要 但是对于孩子编程思维能力的塑造也放在了非常重要的位置 怎么样有效提升孩子的编程思维 少儿编程就是非常好的媒介 在孩子编写程序的过
  • 华为OD机试真题-Excel单元格数值统计【2023Q2】【JAVA、Python、C++】

    题目描述 Excel工作表中对选定区域的数值进行统计的功能非常实用 仿照Excel的这个功能 请对给定表格中选中区域中的单元格进行求和统计 并输出统计结果 为简化计算 假设当前输入中每个单元格内容仅为数字或公式两种 如果为数字 则是一个非负
  • 造成HTTP-500错误,可能存在的原因小结

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 转自 http bbs 51te
  • window MySQL5.6出现中文乱码,设置character_set_server 为 utf8

    使用该命令查看mysql字符集 SHOW VARIABLES LIKE character 发现character set server 为latin1 中文出现乱码 找到C ProgramData MySQL MySQL Server 5
  • 快来玩AI画图!StableDiffusion模型搭建与使用入门~

    1前言 最近AI很火 先是AI画图 然后就ChatGPT 后者我已经用了一段时间了 用来写作文挺不错的 但OpenAI屏蔽了中国IP 加上用户太多啥的 用起来没那么爽 但没办法全球只此一家 只能捏着鼻子用 而AI画图就不一样了 全是开源的
  • 强化学习应用简述---强化学习方向优秀科学家李玉喜博士创作

    强化学习 reinforcement learning 经过了几十年的研发 在一直稳定发展 最近取得了很多傲人的成果 后面会有越来越好的进展 强化学习广泛应用于科学 工程 艺术等领域 下面简单列举一些强化学习的成功案例 然后对强化学习做简介
  • ATT&CK实战系列-红队评估 (红日靶场3)Vulnstack三层网络域渗透靶场

    文章目录 环境配置 靶场介绍 靶场设置 外网渗透 信息收集 端口扫描 目录扫描 漏洞发现与利用 获取ssh账号密码 登录centos 提权 内网渗透 建立代理 内网信息收集 smb暴破 获取本地管理员密码 横向移动 使用psexec模块上线
  • OAK相机:启动报错X_LINK_DEVICE_NOT_FOUND

    OAK相机 启动报错X LINK DEVICE NOT FOUND 环境 报错 原因与解决 未设置 udev 规则 USB崩溃 排线接触不良或相机模块时钟干扰 环境 硬件 4 OV9782相机模组 OAK FFC 4P驱动模组 笔记本电脑
  • webpack之加载json数据格式

    webpack之加载json数据格式 webpack中可以加载的有用资源还有数据 如 json 文件 csv tsv xml 如果需要导入这些格式的数据 第一种方法是 我们需要两个 loader 去加载这些格式的数据 第二种方法是 我们可以
  • dronekit-sitl+MAVproxy+MissionPlanner进行无人机仿真

    以下教程为通过dronekit sitl MAVproxy和MissionPlanner进行无人机仿真 其中dronekit sitl用于模拟无人机 MAVproxy用于将无人机的数据转发到其他端口 MissionPlanner用于无人机的
  • css 背景图旋转 只让背景图片旋转180度的实现示例

    最近进行二次开发的时候有个图片用背景图要旋转一定角度 下图中如果只给 question添加背景通过CSS3的transfrom rotate肯定是会影响文字的展示 所以把背景图放到伪类中进行旋转就可以完美解决这个问题了 话不多说 上代码 d
  • Shell命令行下如何查找并替换多个文件中的字符

    如果你在shell命令行下 需要一种能快速查找并替换多个文件里字符的方法 那么下面这行命令你一定要记住或者收藏起来 它能帮到你的 find name html print0 xargs 0 perl pi e s SEARCHSTRING