如何从目录中的所有 .txt 文件获取部分行?

如何从目录中的所有 .txt 文件获取部分行?

我有 5,000 个期刊文章引用的文本文件。我试图只提取抽象部分。这意味着我想保留相同的文本文档并删除除摘要之外的所有其他文本。我对 Linux 很陌生,我已经在你的主板上玩了一段时间了。

如何提取关键字后面的单词

对目录中的所有文件执行命令

for file in test
nano my.sh
while read variable do
  sed '0,/^Abstract$/d' 
done <file

这是一个类似于科学期刊文章的文件示例

Sponsor     : Beckman Res Inst Cty Hope
      1500 E. Duarte Road
      Duarte, CA  910103000    /   -

NSF Program : 1114      CELL BIOLOGY
Fld Applictn: 0000099   Other Applications NEC                  
          61        Life Science Biological                 
Program Ref : 9285,
Abstract    :
                                                                                         
          Studies of chickens have provided serological and nucleic acid                 
          probes useful in defining the major histocompatibility complex                 
          (MHC) in other avian species.  Methods used in detecting genetic               
          diversity at loci within the MHC of chickens and mammals will be               
          applied to determining the extent of MHC polymorphism within                   
          small populations of ring-necked pheasants, wild turkeys, cranes,              
          Andean condors and other species.  The knowledge and expertise                 
          gained from working with the MHC of the chicken should make for                
          rapid progress in defining the polymorphism of the MHC in these                
          species and in detecting the polymorphism of MHC gene pool within              
          small wild and captive populations of these birds.       

答案1

据我了解,您想要就地更改一系列文件。您想要删除包含第一行在内的所有内容总共Abstract。如果这些文件位于当前目录中并且全部以.txt扩展名命名,则使用:

sed -i '0,/^Abstract$/d' *.txt

由于这会覆盖旧文件,并且万一出现问题,请不要在没有备份的情况下使用它。

这可能需要 GNU sed(这是 Linux 上的标准)。

怎么运行的

  • -i

    -i选项指示sed就地编辑文件。旧文件将被覆盖。

  • 0,/^Abstract$/d

    该命令指示sed删除 ( d) 从第一行(数字 0)到与正则表达式匹配的第一行(包括第一行)的所有行^Abstract$。插入符号^, 匹配行的开头,美元符号匹配行的末尾。因此,此正则表达式匹配包含以下内容的行:仅有的这个词Abstract该行的其他字符。

  • *.txt

    这告诉 shell 选择当前目录中具有后缀的所有文件.txt

更新

这将删除每个文件中的所有行,直到第一行以。。开始 Abstract:

sed -i '0,/^Abstract/d' *.txt

由于$已被删除,因此该正则表达式仅要求该行以 开头Abstract

答案2

使用sed

sed -ni.bak '/^Abstract/,$p' *.txt

^获取从文件开头Abstract,结尾的所有行,并从使用 sed选项$命名的原始文件中保存副本。*.txt.bak-i

awk

awk '/^Abstract/,0' *.txt

如果您也希望 sub_directory 也如此,请使用find以下命令:

find /path/to/main-dir -type f -name "*.txt" -exec  sed -ni.bak '/^Abstract/,$p' '{}';

如果文件名中有新行,效果会更好:

find /path/to/main-dir -type f -name "*.txt" -print0 | while IFS= read -d '' -r file
do
    sed -ni.bak '/^Abstract/,$p' "$file";
done

在问题正文中给定的解决方案(find -name *txt -type d -exec sed -i '0,/^Abstract/d' *.txt {} \;)中,您搜索名称-type d以 结尾的目录(用于搜索目录)txt,如果您没有任何与 相同名称的目录*txt,那么您的-exec部分将无法运行。所以你对该命令什么也不做。

因此,如果您的文件名中有空格,您必须更改*txt -type d"*.txt" -type f(这意味着所有 *.txt 文件)并引用它们。-type f而且您还需要*.txt从命令末尾删除sed,因为'{}'在 find 命令中指向找到的当前文件并引用它。如果您在命令中指定要查找的路径,那就更好了。最后你尝试过的命令如下:

find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;

相关内容