如何使用SED选择性地编辑或跳过某些行

时间:2014-07-11 09:37:48

标签: sed

说我想用TEST代替测试,但不是在“!”之后。在“!”之后应该忽略替换。但不是之前。

我还想跳过包含“skipme”这个词的行

例如:

test
! test
test ! test
blahblah ! test
blah skipme test
test

应该成为:

TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST

3 个答案:

答案 0 :(得分:0)

^也许就是你所需要的一切。

sed -e 's|^test|TEST|' your_file.txt

输出:

TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST

正如grep中的一些注释:

  

插入符号^和美元符号$是元字符   分别匹配a开头和结尾的空字符串   线。

答案 1 :(得分:0)

这是另一个awk

awk '{f=0;for (i=1;i<=NF;i++) {if ($i~/!|skipme/) f=1; if (!f && $i=="test") $i=toupper($i)}}1' file
TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST

工作原理

awk '{
    f=0                         # set flag to 0
    for (i=1;i<=NF;i++) {       # run trough all fields one by one
        if ($i~/!|skipme/)      # if a field contains "!" or "skipme"
            f=1                 # set flag "f" to "1"
        if (!f && $i=="test")   # If field contains "test" and flag "f" is not set, do
            $i=toupper($i)      # Set field to upper characters
        }
    }
1                               # Print the line
' file                          # Read the file

Jidders版本的更新版本,在大多数情况下应该可以使用:
(如果要更改test以上,这将无效,但是 即使单词之间没有空格也能正常工作)

awk '(/!/ && index($0,w)<index($0,"!")) || (/skipme/ && index($0,w)<index($0,"skipme")) || !/!|skipme/ {c=toupper(w);sub(w,c)}1' w="test" file

答案 2 :(得分:0)

通过perl,

$ perl -pe 's/(?<!\! )test/TEST/ unless /skipme/' file
TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST 

仅当test不在TEST之前,并且跳过包含字符串!的行时,它才会将skipme替换为{{1}}。