我是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
任何帮助都将不胜感激。
答案 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