假设我的搜索字词是CAT,替换字词是DOG 我只想匹配CAT之前以空格开头的内容,无论空白多少。另外,有什么方法可以保留正确的空白量吗?
所以
else CAT {
会留下来
else CAT {
但是
CAT {
会变成
DOG {
和
CAT {
会变成
DOG {
我正在尝试sed -i ' ' -E "s/^[^a-z]*CAT/DOG/g" $file
,以便它不会匹配在行首和搜索字词之间的任何字母的任何内容
和其他变化,但没有发现任何正常工作。我无法sed -i ' ' -E "s/^[ \t]*CAT/DOG/g" $file
因为\t
无法在OSX上工作
----我的档案:
method()
{
if ((self = [super init])) {
hello1
}
else if ((self = [super init])) {
hello2
}
}
----使用sed -i '' "s/^\([[:blank:]]*\)$s/\1$r/" $file
将其变成:
method()
{
self = [super init];
if (self) {
hello1
}
if () {
hello2
}
}
这很糟糕,因为我根本不想要第二个如果受到影响。第一个是好的。
答案 0 :(得分:1)
您可以将character class与捕获组一起使用
s='CAT'
r='DOG'
sed -i '' -E "s/^([[:blank:]]*)$s/\1$r/" file
sed 's/^\([[:blank:]]*\)CAT/\1DOG/'
匹配零个或多个空格并在第1组\([[:blank:]]*\)
中捕获它们。示例强>
\1
答案 1 :(得分:0)
您可以将捕获组用于空格:
<div class="box1">BOX 1:hover my</div>
<div class="box2">Box 2</div>
没有必要使用sed -i ' ' -E 's/^([[:blank:]]*)CAT/\1DOG/' file
标志,因为我们只在开始时更换一次。
如果要使用变量,请使用双引号:
g
答案 2 :(得分:0)
你的问题很不清楚,但也许这就是你想要的:
$ cat tst.sh
old='if ((self = [super init])) {'
awk -v old="$old" '
BEGIN {
new = old
gsub(/.*\(|\).*/,"",new)
new = new ";"
}
start=index($0,old) {
before = substr($0,1,start-1)
after = substr($0,start+length(old))
if (before ~ /^[[:space:]]*$/) {
$0 = before new after
}
}
{ print }
' file
$ ./tst.sh
method()
{
self = [super init];
hello1
}
else if ((self = [super init])) {
hello2
}
}
请注意,您可以动态构建替换文本,因为它使用文字字符串而不是regexp和backreference-enabled-string操作,您不需要在要搜索的字符串中转义任何内容,或者它的替代品(反斜杠除外 - 如果需要,我们可以调整它来修复)。
如果您一直在考虑使用sed或在awk中使用* sub()或match(),请先阅读Is it possible to escape regex metacharacters reliably with sed。