说我想用TEST代替测试,但不是在“!”之后。在“!”之后应该忽略替换。但不是之前。
我还想跳过包含“skipme”这个词的行
例如:
test
! test
test ! test
blahblah ! test
blah skipme test
test
应该成为:
TEST
! test
TEST ! test
blahblah ! test
blah skipme test
TEST
答案 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}}。