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

如何使用SED选择性地编辑或跳过某些行,sed,Sed,假设我想用test替换test,但不是在“!”之后,替换应该在“!”之后忽略,而不是在“!”之前 我还想跳过包含“skipme”一词的行 例如: 应成为: TEST ! test TEST ! test blahblah ! test blah skipme test TEST ^也许就是你所需要的 sed -e 's|^test|TEST|' your_file.txt 产出: TEST ! test TEST ! test blahblah ! test blah skipme test

假设我想用test替换test,但不是在“!”之后,替换应该在“!”之后忽略,而不是在“!”之前

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

例如:

应成为:

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

^
也许就是你所需要的

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

TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST
grep
中的一些注释所示:

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


这里是另一个
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

还有一个是通过perl

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

$perl-pe的/(?你为什么不使用awk呢?
test
是否总是改变行中的第一个世界,或者你可以有
blah test!test
需要变成
blah test!test
这比我的问题更好一行如何
我的测试
?没有提到行需要从
test
开始,我看不出来
my test
在他的示例中的任何地方。不,但这只是一个测试示例。问题是将
test
更改为
test
,但不是在
之后!
skipme
(没有提到它需要成为第一个单词)好的,我们可以看看OP是否是明确的意思。它不在OPs的例子中,但对于像
blah test skipme more test
test skipme test
@Jotne这样的行,这将失败。他想跳过包含
skipme
的行。不,我想他是说我想跳过将
test
更改为
test
他是说,如果行中包含
skipme
test for test,我不想将
test
替换为
test
,但不能在“!”>之后,我还想跳过包含“skipme”的行
。对我来说,这可能意味着在滑雪后不要更改测试。我们必须等待OP的响应才能弄清楚。
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
awk '(/!/ && index($0,w)<index($0,"!")) || (/skipme/ && index($0,w)<index($0,"skipme")) || !/!|skipme/ {c=toupper(w);sub(w,c)}1' w="test" file
$ perl -pe 's/(?<!\! )test/TEST/ unless /skipme/' file
TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST