首页 > 解决方案 > 如何通过 sed 或 awk 匹配和替换匹配后的字符串

问题描述

我有一个文件,我想使用 cat 将其修改为一个新文件。所以该文件包含如下行:

name "myName"
place "xyz" 

等等....

我希望将这些行更改为

name "Jon"
place "paris"

我试图这样做,但它不起作用:

cat originalFile | sed 's/^name\*/name "Jon"/' > tempFile 

我尝试使用各种特殊字符,但它不起作用。我无法识别名称后的空格字符,然后是“myName”。

标签: regexawksed

解决方案


您可以使用 匹配该行的其余部分.*,并且可以将空格与空格匹配,或者[[: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"

推荐阅读