Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何通过sed或awk匹配和替换匹配后的字符串_Regex_Awk_Sed - Fatal编程技术网

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

Regex 如何通过sed或awk匹配和替换匹配后的字符串,regex,awk,sed,Regex,Awk,Sed,我有一个文件,我想修改成一个新的文件使用猫。 因此,该文件包含以下行: name "myName" place "xyz" 等等 我想把这些行改成 name "Jon" place "paris" 我试着这样做,但不起作用: cat originalFile | sed 's/^name\*/name "Jon"/' > tempFile 我试着使用各种特殊的字符,但都不起作用。我无法识别名称后的空格字符,然后是“myName”。您可以使用*匹配行的其余部分,您可以将空格与空格匹

我有一个文件,我想修改成一个新的文件使用猫。 因此,该文件包含以下行:

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
请注意,此处有两个replace命令,以s分号连接。由于空格POSIX字符类不是文字,为了在替换
\1
后保留它,应使用反向引用(插入用组1捕获的文本),因此必须使用捕获组包装第一部分

见:


awk
备选方案:

awk '$1=="name"{$0="name \"Jon\""} $1=="place"{$0="place \"paris\""} 1' originalFile
name
place
前面有空格时,它将起作用
这里不是正则表达式匹配,而是字符串比较。
awk
用空格字符分隔字段,空格字符包括
\n


当您觉得结果正确时,将tempFile添加到它。

命名为“myName”\n放置为“xyz”\n等等……
sed的/^name.*/name“Jon”/;s/^place.*/place“paris”/“originalFile>tempFile
?@WiktorStribiż这个怎么样
sed-E的/^(名称)。*(位置)。*/\1“Jon”\2“Paris”/g”文件名
,这样做不好吗?@MostafaHussein与OP的字符串不匹配。@MostafaHussein是因为我选择了BRE。这是完全优先的:如果您想要保留的模式部分是文本,那么您不需要组/反向引用。接吻法。谢谢你的解决方案。另外一个问题是,如果名称和“myName”之间有空格和制表符,我该如何处理。在名称后只能有空格字符的场景,以及有选项卡的场景和两者都有的场景。目前s/^name.*/name“Jon”/“这对我很有用。但我想充分证明以上三种情况。@Heyya你已经得到了答案:使用
[[:space:]]
,这对
\t
或简单空格都有效。@Heyya使用
sed的/^\(name[:space:]\)./\1“Jon/;s/^\(place[:space:][]\)./\1“paris”/“originalFile>tempFile
@Heyya它对你有用吗?如果有问题,请考虑接受。
name "Jon"
place "paris"
awk '$1=="name"{$0="name \"Jon\""} $1=="place"{$0="place \"paris\""} 1' originalFile