搜索文本并附加到文本文件行的每一端 - OSX

时间:2015-12-30 21:36:34

标签: macos bash text sed append

我是OSX命令行工具的新手。

我正在尝试在文件中找到一个文本块,并将此文本附加到另一个文本文件中所有行的末尾。在运行时我不知道这个文本是什么,我只知道它将位于“BEGINHMM”和“ENDHMM”内。另外,我不知道目标文件的构成,除了它不是一个空文本文件。

找到感兴趣的文本块的命令是:

sed -n '/<BEGINHMM>/,/<ENDHMM>/p' proto

其中“proto”是包含感兴趣文本的文本文件。

我一直试图通过以下方式将上述命令的输出传递给另一个'sed'命令:

xargs -I '{}' sed -i .bak 's/$/{}/' monophones0.txt 

但是我得到了一些奇怪的结果,我看到例如在文本中插入了“{}”。

我也尝试过管道:

xargs -0 sed -i .bak 's/$/&/' monophones0.txt

但我只是得到了我想要抓取的文字的打印输出(类似于终端回声)。

最终我想在多个目录中循环几个'proto'文件,并在每个目录中的“BEGINHMM”,“ENDHMM”块之间复制文本,并将所选文本追加到该目录的monophones.txt行。

我在终端运行命令bash,OSX 10.12.2

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

(1)您的sed命令格式为sed -n '/A/,/B/p';这将包括A和B出现的行,即使这些字符串没有出现在行的开头。这个表格也可能有其他惊喜(如果B丢失或重复,会发生什么预期会发生?),但这篇文章的其余部分假定这是你想要的。

(2)目前尚不清楚你打算如何指定“proto”文件,但是你确实指出它们可能在几个目录中,所以对于这篇文章的其余部分,我假设它们被列出,每行一个,在每个目录中名为proto.txt的文件中。这将确保您不会对命令行长度产生任何限制,但如果您不想创建此类文件,则可以轻松修改以下内容。

(3)这是一个脚本,它将使用你提到的sed命令将目录中指定的每个“proto”文件中的段复制到执行脚本的目录中的monophones0.txt。 / p>

#!/bin/bash

OUT=monophones0.txt

cat proto.txt | while read file
do
  if [ -r "$file" ] ; then
    sed -n '/<BEGINHMM>/,/<ENDHMM>/p' "$file" >> $OUT
  elif [ -n "$file" ] ; then
    echo "NOT FOUND: $file" >&2
  fi
done    

答案 1 :(得分:0)

就像你之前做过的那样。 tmpfile=$(mktemp); sed -n '/<BEGINHMM>/,/<ENDHMM>/p' proto >$tmpfile; sed -i .bak "r $tmpfile" monophones0.txt; rm $tmpfile。这是基本的想法;您需要执行其他检查才能使其成为一个健壮的脚本。                      - 4ae1e1

相关问题