【问题标题】:Find and append to Text Between Two Strings or Words using sed or awk使用 sed 或 awk 查找并附加到两个字符串或单词之间的文本
【发布时间】:2016-03-14 12:06:23
【问题描述】:

我正在寻找一个sed,我可以在其中识别两个指示器之间的所有文本,然后用占位符替换它。

例如,第一个指标是单词列表

(no|noone|haven't)

第二个指标是标点符号列表 代码:

(.|,|!)

来自输入文本,例如

“没有人了解剧情。没有故事情节。我没有 把这部电影推荐给我的朋友!你明白了吗?”

期望的结果是。

“没有人理解_AFFIX我_AFFIX。没有故事情节_AFFIX。我 没有推荐_AFFIX this_AFFIX 电影_AFFIX to_AFFIX my_AFFIX 朋友们_AFFIX!你明白了吗?”

我知道有以下sed

sed -n '/WORD1/,/WORD2/p' /path/to/file

识别两个指标之间的内容。我还发现了很多很棒的信息和资源here。但是,我仍然找不到将词缀附加到两个指示器之间出现的每个文本标记的方法。

我也考虑过用awk,比如

awk '{sub(/.*indic1 /,"");sub(/ indic2.*/,"");print;}' < infile

然而,它不允许我附加词缀。

有没有人建议这样做,awksed

【问题讨论】:

  • A.您所依赖的 sed 语法依赖于行来分隔范围,因此它不适用于同一行中的文本。 B. 您最好在 awk 中一次搜索 1 个单词并在那里管理输出。 C. 你的例子似乎不一致。将您的“规则”应用于 Noone understands the plot 产生 Noone understands_AFFIX me_AFFIX. 其中 There is no storyline. 产生 There is no storyline_AFFIXAFFIX 是如何在第一个中插入 2x 而在第二个中仅插入 1x 的?祝你好运。

标签: regex awk replace sed


【解决方案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!你明白了吗?

【讨论】:

    【解决方案2】:

    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 将它们重新连接成一个字符串。

    【讨论】:

    • 我什至没有想过使用perl 来解决这个问题。就一个问题。关于指标,他们是在搜索真实的词(即-w)还是仅仅在一个词中找到指标词的一部分?
    • @owwoow14:正如这里所写,它们也作为子字符串匹配。如果需要,您可以添加字边界\b
    【解决方案3】:

    这是一个冗长的 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?

    【讨论】:

      猜你喜欢
      • 2015-07-15
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 2018-01-19
      相关资源
      最近更新 更多