osx sed regex仅匹配搜索词

时间:2016-09-21 17:35:32

标签: regex bash sed

假设我的搜索字词是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
    }
}

这很糟糕,因为我根本不想要第二个如果受到影响。第一个是好的。

3 个答案:

答案 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