[英]matching ranges in sed
在我的编程中,我需要使用sed在某个文件中将一些字符替换为另一个字符。 但在某些单词之间,只有当这个字符串包含一些额外的单词时。 所以我写道:
sed -re '/from:/,/end/ { /extraword/s/[_old_characters_]/new_character/g; }'
但是这段代码完全忽略了这个/from:/,/end/
strings。 它将所有[_old_characters_]
替换为new_character
从from:
到此行的末尾。 我做错了什么?
我需要的是:
sed -re '/A/,/B/ { /word/s/[C]/X/g; }'
文件:
word CCC A CCC B CCC
wor A CCC B
变为:
word CCC A XXX B CCC
wor A CCC B
这可能适合你(GNU sed):
sed -r '/word/{:a;/(A)([^ABC]*C+[^ABC]*)(B)/{s//\1\n\2\n\3/;h;y/C/X/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/;ba}}' file
这个过滤行包含单词word
和A
后跟C
后跟B
然后这些线具有放置在A
之后和B
之前的标记( \\n
),并且该线的副本被放置在保持空间(HS)中。 将所有C
替换为X
,然后将HS中的副本附加到修改后的行中,并从两者重建所需的行。 然后再次测试新生产线,如有必要,重复该过程。
如果A
和B
是单词,那么使用相同的技术,但在A
之后和之前用B
替换\\n
,然后测试/ \\n
.*C.* \\n
如果条件/\\n.*C.*\\n/
记住删除所有\\n
。
如果使用sed
证明太难看,这是一个Perl
解决方案:
$ perl -pe 'if (m/word/) {s/(A[^C]*) (.*) ([^C]*B)/$1 . " " . "X" x length($2) . " " . $3/gei;}'
word CCC A CCC B CCC
word CCC A XXX B CCC
wor A CCC B
wor A CCC B
就像是
sed '/^word/s/A CCC B/A XXX B/g'
例如
>>> echo word CCC A CCC B CCC | sed '/^word/s/A CCC B/A XXX B/g'
word CCC A XXX B CCC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.