如何使用SED选择性地编辑或跳过某些行
假设我想用test替换test,但不是在“!”之后,替换应该在“!”之后忽略,而不是在“!”之前 我还想跳过包含“skipme”一词的行 例如: 应成为:如何使用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
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