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
Regex 从一对词中脱口而出_Regex_Sed - Fatal编程技术网

Regex 从一对词中脱口而出

Regex 从一对词中脱口而出,regex,sed,Regex,Sed,可以使用如下命令将单词“before”替换为单词“before”,其中“before”出现在单词“begin”和“end”之间: sed'/begin/,/end/{s/before/after/g}' 我正在寻找一种将“before”替换为“after”的方法,前提是它们不会出现在一对“begin”和“end”中。该作业的正确工具是awk而不是sed。要执行与当前的sed相同的操作: echo 'before begin before end before' | awk ' BEGIN

可以使用如下命令将单词“before”替换为单词“before”,其中“before”出现在单词“begin”和“end”之间:

sed'/begin/,/end/{s/before/after/g}'


我正在寻找一种将“before”替换为“after”的方法,前提是它们不会出现在一对“begin”和“end”中。

该作业的正确工具是
awk
而不是
sed
。要执行与当前的
sed
相同的操作:

echo 'before
begin
before
end
before' | awk '
    BEGIN {st=0;}
    /begin/ {st=1;}
    /end/ {st=0;}
    {
        if (st==1) {
            gsub("before","after");
            print;
        } else {
            print
        }
    }'
将为您提供:

before
begin
after
end
before
after
begin
before
end
after
如果将控制
gsub
If
语句的意义颠倒过来,您将得到想要的:

echo 'before
begin
before
end
before' | awk '
    BEGIN {st=0;}
    /begin/ {st=1;}
    /end/ {st=0;}
    {
        if (st==0) {
            gsub("before","after");
            print;
        } else {
            print
        }
    }'
将为您提供:

before
begin
after
end
before
after
begin
before
end
after

该作业的正确工具是
awk
,而不是
sed
。要执行与当前的
sed
相同的操作:

echo 'before
begin
before
end
before' | awk '
    BEGIN {st=0;}
    /begin/ {st=1;}
    /end/ {st=0;}
    {
        if (st==1) {
            gsub("before","after");
            print;
        } else {
            print
        }
    }'
将为您提供:

before
begin
after
end
before
after
begin
before
end
after
如果将控制
gsub
If
语句的意义颠倒过来,您将得到想要的:

echo 'before
begin
before
end
before' | awk '
    BEGIN {st=0;}
    /begin/ {st=1;}
    /end/ {st=0;}
    {
        if (st==0) {
            gsub("before","after");
            print;
        } else {
            print
        }
    }'
将为您提供:

before
begin
after
end
before
after
begin
before
end
after

反转几乎是微不足道的:

sed '/begin/,/end/ !s/before/after/g'
请注意,给定以下输入

begin before end
before
end
before
begin
before end
before
end
before
原始脚本将提供以下输出:

begin after end
after
end
before
begin
after end
before
end
before

请注意,与“开始”在同一行上的“结束”不会关闭替换。(如果在“begin”之后使用“end before”,则“before”仍然被“after”替换)。

倒装法几乎不重要:

sed '/begin/,/end/ !s/before/after/g'
请注意,给定以下输入

begin before end
before
end
before
begin
before end
before
end
before
原始脚本将提供以下输出:

begin after end
after
end
before
begin
after end
before
end
before

请注意,与“开始”在同一行上的“结束”不会关闭替换。(如果在“开始”之后使用“结束之前”,则“之前”仍然替换为“之后”)

-1,因为sed版本完全不重要,并且比awk-1更合适,因为sed版本完全不重要,比awk更合适的是,在地址范围的开头有一个超级字“s”。在地址范围的开头有一个超级字“s”。