我有 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' '{}' \;