【发布时间】:2019-01-08 07:36:52
【问题描述】:
这是我的问题(使用 Mac OS X):
-
我有大约 35 个 FASTA 文件,每个文件有 30 个序列。每个 FASTA 文件代表一个基因,它们都包含相同的个体,每个文件中具有相同的序列头。标题格式为“####_G_species”,数字不连续。我需要遍历每个文件并更改 4 个特定的标题,同时将输出保持为 35 个与相应输入文件同名的离散文件,最好将输出存放到单独的子目录中。
例如:每个文件都包含一个“6934_Sergia_sp”,我需要更改 所有 35 个文件中该名称的每个实例都指向“6934_R_robusta”。我需要对“8324_Sergestes_sp”做同样的事情,将每个文件中的每个实例都更改为“8324_P_vigilax”。用不同的标题冲洗并再重复 2 次。更改标题后,我需要有 35 个与相应输入文件同名的离散输出文件。
-
到目前为止,我发现似乎最有希望的内容来自以下链接: https://askubuntu.com/questions/84007/find-and-replace-text-within-multiple-files
使用以下脚本:
find /home/user/directory -name \*.c -exec sed -i "s/cybernetnews/cybernet/g" {} \;更改信息以满足我的需要,我得到一个这样的脚本:
find Path/to/my/directory -name \*.fas -exec sed -i 's/6934_Sergia_sp/6934_R_robusta/g' {} \;像这样运行脚本,我得到“未定义标签”错误。经过研究, https://www.mkyong.com/mac/sed-command-hits-undefined-label-error-on-mac-os-x/
我发现我应该在 -i give 之后添加“.fas”:
find Path/to/my/directory -name \*.fas -exec sed -i '.fas' 's/6934_Sergia_sp/6934_R_robusta/g' {} \;因为在 Mac 上您需要为输出文件指定扩展名。像这样运行脚本,我得到了几乎我正在寻找的每个输入文件,每个输入文件中的正确标题被正确替换为新名称,并且输出被放置在同一目录中。但是,这一次只替换一个标头,并且输出文件具有 .fas.fas 扩展名。
接下来,我将不得不重命名输出文件以删除扩展名中的第二个“.fas”,然后再重写并重新运行脚本 3 次,以使所有内容都按照我想要的方式改变,这不会是世界末日,但绝对不会是理想的。
是否可以设置一个脚本,以便我可以同时运行所有 4 个替换,同时还将输出导出到新的子目录?
【问题讨论】:
-
edit 你的问题包括简洁、可测试的样本输入和预期输出。
-
Mac
sed将接受sed -i '' 's/.../.../' file(即两个单引号),表示不制作备份文件,只需覆盖现有文件即可。祝你好运。
标签: bash macos sed replace find