我正在寻找一个sed
我可以识别两个指标之间的所有文本,然后用占位符替换它。
例如,第一个指标是单词列表
(no|noone|haven't)
,第二个指标是标点符号列表 代码:
(.|,|!)
来自输入文本,例如
"没有人理解情节。没有故事情节。我没有 推荐这部电影给我的朋友们!你明白了吗?"
期望的结果将是。
"没人理解_AFFIX me_AFFIX。没有storyline_AFFIX。一世 避免推荐_AFFIX this_AFFIX movie_AFFIX to_AFFIX my_AFFIX friends_AFFIX!你明白了吗?"
我知道有以下sed
:
sed -n '/WORD1/,/WORD2/p' /path/to/file
识别两个指标之间的内容。我还发现了很多很棒的信息和资源here。但是,我仍然找不到一种方法来将词缀附加到两个指示符之间出现的每个文本标记。
我还考虑过使用awk
,例如
awk '{sub(/.*indic1 /,"");sub(/ indic2.*/,"");print;}' < infile
但是,它不允许我附加词缀。
是否有人建议您使用awk
或sed
?
答案 0 :(得分:1)
Perl救援!
perl -pe 's/(?:no(?:one)?|haven'\''t)\s*\K([^.,!]+)/
join " ", map "${_}_AFFIX", split " ", $1/egi
' infile > outfile
\K
与其左侧的内容匹配,但将其从替换中排除。在这种情况下,它会验证第一个指标。 (\K
需要Perl 5.10 +。)/e
将替换部分评估为代码。在这种情况下,代码会在空格上分割$1
,map会向每个成员添加_AFFIX
,join
会将它们连接回字符串。答案 1 :(得分:1)
这是一个详细的awk命令:
s="Noone understands the plot. There is no storyline. I haven't recommended this movie to my friends! Did you understand it?"
awk -v IGNORECASE=1 -v kw="no|noone|haven't" -v pct='\\.|,|!' '{
a=0
for (i=2; i<=NF; i++) {
if ($(i-1) ~ "\\y" kw "\\y")
a=1
if (a && $i ~ pct "$") {
p = substr($i, length($i), 1)
$i = substr($i, 1, length($i)-1)
}
if (a)
$i=$i "_AFFIX" p
if(p) {
p=""
a=0
}
}
} 1'
<强>输出:强>
Noone understands_AFFIX the_AFFIX plot_AFFIX. There is no storyline_AFFIX. I haven't recommended_AFFIX this_AFFIX movie_AFFIX to_AFFIX my_AFFIX friends_AFFIX! Did you understand it?
答案 2 :(得分:1)
更紧凑awk
$ awk 'BEGIN{RS=ORS=" ";s="_AFFIX"}
/[.,!]$/{f=0; $0=gensub(/(.)$/,"s\\1","g")}
f{$0=$0s}
/Noone|no|haven'\''t/{f=1}1' story
没人理解_AFFIX the_AFFIX plot_AFFIX。没有storyline_AFFIX。我还没推荐_AFFIX this_AFFIX movie_AFFIX to_AFFIX my_AFFIX friends_AFFIX!你明白了吗?