【发布时间】:2013-02-17 01:46:23
【问题描述】:
目标: 要遍历一个文本文件文件夹,请提取所有行尾、自动换行、带连字符的单词,并将它们整理成一个列表。
001.txt be-littled
001.txt dev-eloper
002.txt sand-wich
...
其目的是扫描列表并将有效的连字词与仅包含单词的单词区分开来(即,24 与 dev-eloper)。
我当前的 Bash/sed 脚本正确地捕获了大部分(足够)单词。我知道它需要一些调整(比如当连字符结束段落时)。
但现在,我无法将当前文件名放入模式空间。
for f in *.txt
do
sed -rn 'N;/PATTERN/!{D};s:PATTERN:\3-\5\n\7:;P;D' * > output.txt;
done
..其中 PATTERN = (^.)(+)(.+)(-\n)(\S+)(+)(.$)
或
for f in *.txt; do sed -rn 'N;/(^.*)( +)(.+)(-\n)(\S+)( +)(.*$)/!{D};s:(^.*)( +)(.+)(-\n)(\S+)( +)(.*$):\3-\5\n\7:;P;D' * > output.txt;done
我尝试将 '"$f"' 放在 \3 之前,但这只是在所有行的最后一页前面(即,'250.txt be-littled')。
我怀疑我的代码并没有完全按照我的想法做。 :-) 也许我不了解 sed 在 bash 中的循环顺序。
我使用的是 Ubuntu 12.10,几周前才开始学习 bash 和 sed。我愿意接受建议。
谢谢,
【问题讨论】:
-
您能否构建一个更简单的正则表达式示例,以使您问题中的代码更易于阅读?
-
您应该使用
for f in *.txt ; do sed ' ....' $f >> output ; done或sed '....' * >> output。您当前的构造每次都通过循环处理所有文件。解决这个问题,然后看看你的问题是什么样的。祝你好运。 -
您介意举一个您的案例
end-of-line, word-wrapped, hyphenated words的例子吗?行尾和连字符实际上是可以的,但是word-wrapped是什么意思? 而且,匹配是否应具有所有这些特征,或者其中之一足以限定匹配?