如何在匹配之后通过sed或awk匹配和替换字符串

时间:2019-03-15 22:55:59

标签: regex awk sed

我有一个文件,要使用cat修改为新文件。 因此,该文件包含以下行:

name "myName"
place "xyz" 

以此类推。...

我希望将这些行更改为

name "Jon"
place "paris"

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用[[:blank:]]匹配行的其余部分,也可以使用空格或[[:space:]]sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' originalFile > tempFile 来匹配空格:

\1

请注意,这里有两个与s分号连接的replace命令。第一部分包装了一个捕获组,这是必需的,因为空格POSIX字符类不是文字的,并且为了在替换s='name "myName" place "xyz"' sed 's/^\(name[[:space:]]\).*/\1"Jon"/;s/^\(place[[:space:]]\).*/\1"paris"/' <<< "$s" 后向引用后保留它,应该使用它(插入用组1捕获的文本)。

请参见online demo

name "Jon"
place "paris"

输出:

{{1}}

答案 1 :(得分:0)

另一种awk

awk '$1=="name"{$0="name \"Jon\""} $1=="place"{$0="place \"paris\""} 1' originalFile

nameplace之前有空格时,它将起作用。
这里不是正则表达式匹配,而只是字符串比较。
awk用空格字符分隔字段,其中包括\n

当结果对您来说正确时,在其上附加> tempFile