regex - 如何通过 sed 或 awk 匹配和替换匹配后的字符串
问题描述
我有一个文件,我想使用 cat 将其修改为一个新文件。所以该文件包含如下行:
name "myName"
place "xyz"
等等....
我希望将这些行更改为
name "Jon"
place "paris"
我试图这样做,但它不起作用:
cat originalFile | sed 's/^name\*/name "Jon"/' > tempFile
我尝试使用各种特殊字符,但它不起作用。我无法识别名称后的空格字符,然后是“myName”。
解决方案
您可以使用 匹配该行的其余部分.*
,并且可以将空格与空格匹配,或者[[:blank:]]
或[[:space:]]
:
sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' originalFile > tempFile
注意这里有两个用 s 分号连接的替换命令。第一部分用捕获组包裹,这是必要的,因为空格 POSIX 字符类不是文字,并且为了在替换\1
反向引用后保留它(插入使用组 1 捕获的文本)。
查看在线演示:
s='name "myName"
place "xyz"'
sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' <<< "$s"
输出:
name "Jon"
place "paris"
推荐阅读
- vue.js - 运行“npm run build”时生成 web.config 文件
- amazon-cognito - 如何检查 Cognito 用户 admin-set-user-mfa-preference 值
- javascript - 使用JS设置div的高度以匹配另一个div的底部位置
- node.js - passport-github2 在电子邮件字段中返回 null
- laravel - Laravel V4.1.0:401 代码“消息”:“未验证”。用于 API
- java - 如何将不同的类对象添加到 ArrayList
- mysql - 如果后面的记录符合条件,则返回 id 的结果
- java - 有没有办法改变 Lambda 表达式中的值?
- azure-cosmosdb - CosmosDB 迁移 MERN-无法读取集合
- python-3.x - zlib1g-dev 已安装但显示 ModuleNotFoundError: No module named 'zlib'