答:的SunOS在bash脚本sed的 - 更换模式:没有什么变化
作为 mlv和 sorontar提到,我SED的版本是BRE,不支持| (管)。所以在我的情况是有可能使用类似:
sed "s/\([namevlu]*=\"\)BASE\.$str1/\1BASE\.$str2/g"
匹配名= “和值=”但不其他= “和值=”其中。正则表达式([namevlu])只包含我需要的字符。好吧,这不是像保存,因为可以,但我不希望存在像valuenm =“左右。如果有人需要确切指定正则表达式,它需要两个(或更多)sed。
原题:
我需要用另一个替换一个字符串,但可以肯定,我需要检查特定的上下文
例如:
等等VAL1 =“BASE.OLD_TEXT_OR_SO”布拉布拉
等等VAL2 = “BASE.OLD_SOMETHING” ...
我想改变
等等VAL1 = “BASE.NEW_TEXT_OR_SO” 布拉布拉
等等VAL2 = “BASE.NEW_SOMETHING” ...
这个脚本不会改变任何东西:
#!/bin/bash
...
str1="OLD_"
str2="NEW_"
sed "s/\(name=\"|value=\"\)BASE\.$str1/\1BASE\.$str2/g" input.file > output.file
但后来similiar SED工程确定:
sed "s/\(<Tag>\)[A-Z0-9\-\._|]*\(<\/Tag>\)/\1$otherStr\2/g" input.file > output.file
输出文件仍然BASE.OLD_:/
还当我尝试它在控制台上,我得到相同的(无)结果。我认为“寻找”模式有问题,但我不知道是什么。
$ str0='blah name="BASE.OLD_TEXT_OR_SO" blabla
> blah value="BASE.OLD_SOMETHING" ...
> blah other="BASE.OLD_SOMETHING" ...
> blah values="BASE.OLD_SOMETHING" ...'
$ echo $str0 | sed "s/\(val1=\"|val2=\"\)BASE\.$str1/\1BASE\.$str2/g"
正则表达式是在online tester它工作正常进行测试。
(name="|value=")BASE\.OLD_
\1BASE\.NEW_
系统:
的SunOS 5.11
GNU的bash 4.1.11(1)-release
桑达4.2.1
预先感谢。
str0有一个新行吗?在你的问题中吗?你可以正确更新变量吗? – Inian
str0有换行符,它只是在控制台(echo str0 | ...)中进行测试..原来的数据是从输入文件中获取的。 – Triptaminer
为什么不能直接在文件中替换该模式?只需在脚本im中使用sed“s/\(val1 = \”| val2 = \“\)提供要替换为 – Inian