Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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:用相同的匹配项替换匹配项并添加更多文本_Regex_Unix_Sed - Fatal编程技术网

Regex sed:用相同的匹配项替换匹配项并添加更多文本

Regex sed:用相同的匹配项替换匹配项并添加更多文本,regex,unix,sed,Regex,Unix,Sed,我有一个名为config.properties的文件,其中包含以下文本: cat config.properties 我的目标是保留相同的数据,但添加更多数据。对于本例,我想将此变量| JJ | PZ的赋值添加到以下结果中: cat config.properties 我一直在使用的命令是: sed 's/\(com\.enterprise\.project\.AERO_CARRIERS\s*\=\s*.+\)/\1\|JJ\|PZ/g' config.properties 但这不起作用。我

我有一个名为config.properties的文件,其中包含以下文本:

cat config.properties

我的目标是保留相同的数据,但添加更多数据。对于本例,我想将此变量| JJ | PZ的赋值添加到以下结果中:

cat config.properties

我一直在使用的命令是:

 sed 's/\(com\.enterprise\.project\.AERO_CARRIERS\s*\=\s*.+\)/\1\|JJ\|PZ/g' config.properties

但这不起作用。我做错了什么?

作为使用sed等流编辑器的替代方法,只需使用本机文本编辑器,即UNIX days提供的用于就地搜索和替换的文本编辑器。使用的选项-s与POSIX兼容,因此在可移植性方面没有问题

printf '%s\n' ",g/com.enterprise.project.AERO_CARRIERS/ s/$/\|JJ\|PZ/g" w q | ed -s -- inputFile
部件g/com.enterprise.project.AERO|u/CARRIERS/搜索包含图案的行,部件s/$/\\\\JJ\\\PZ/g在该行末尾附加| JJ | PZ,w q将文件写入并保存到位。

\s和+与POSIX不兼容:

您可以将空格和制表符与[[:blank:]匹配,将空格字符(包括换行符)与[[:space:]匹配

.+可以替换为。\{1,\}或*

您不需要在此处使用backreference,而是使用&来输出与您的模式匹配的行:

sed 's/^com\.enterprise\.project\.AERO_CARRIERS[[:blank:]]*=[[:blank:]]*.\{1,\}/&|JJ|PZ/'
您可以首先匹配:

sed '/com\.enterprise\.project\.AERO_CARRIERS\s*\=\s*.\+/ s/$/|JJ|PZ/g' config.properties

它对我有用。您的sed可能不支持\s-请改为尝试[[:blank:]哦,等等,我在撒谎,它不起作用..+不在sed基本正则表达式中;您必须使用BRE或sed-r GNU或sed-E BSD sed的..*或.\+GNU扩展。谢谢!!错误是使用了.+而不是.\+.Nitpick:可移植性取决于工具不同实现的POSIX兼容性。仅仅存在POSIX规范并不能保证可移植性——如果我使用POSIX规范中定义的功能,而工具不一致,那么我确实存在可移植性问题。@BenjaminW:我真的很感激这个事实,我看到的所有POSIX合规性词语都有点口语化。谢谢你的澄清!现在重新措辞!
sed 's/^com\.enterprise\.project\.AERO_CARRIERS[[:blank:]]*=[[:blank:]]*.\{1,\}/&|JJ|PZ/'
sed '/com\.enterprise\.project\.AERO_CARRIERS\s*\=\s*.\+/ s/$/|JJ|PZ/g' config.properties