【问题标题】:replace string with underscore and dots using sed or awk使用 sed 或 awk 将字符串替换为下划线和点
【发布时间】:2016-09-17 20:37:44
【问题描述】:

我有一堆文件名由下划线和点组成,这里是一个例子:

META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params

我想删除包含.bed.nodup.sortedbed.roadmap.sort.fgwas.gz. 的部分,因此预期的文件名输出将是META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params

我正在使用这些 sed 命令,但没有一个可以工作:

stringZ=META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params
echo $stringZ | sed -e 's/\([[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.\)//g'
echo $stringZ | sed -e 's/\[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.[[:lower:]]\.//g'

任何解决方案都是 sed 或 awk 都会有很大帮助

【问题讨论】:

  • 那么你想从所有这些文件名中删除完全相同的子字符串(即bed.nodup.sortedbed.roadmap.sort.fgwas.gz.)吗?
  • 是的@redneb,相同的子字符串在文件名中重复。我试图使用正则表达式来匹配子字符串
  • 如果你有一个固定的子字符串,你需要正则表达式做什么?只需使用子字符串本身作为模式。
  • 我想要一些更通用的东西,因为我还有另一个文件具有类似的模式,但这次每个文件中的子字符串都发生了变化
  • 如果每个文件中的子字符串发生变化,那么在你的问题中说清楚,我们会给你最合适的答案。到目前为止,您接受的答案远不是解决问题的好选择。

标签: regex bash awk sed


【解决方案1】:

不要在如此简单的任务中使用外部实用程序和正则表达式!请改用parameter expansions

stringZ=META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params
echo "${stringZ/.bed.nodup.sortedbed.roadmap.sort.fgwas.gz}"

要重命名所有包含.bed.nodup.sortedbed.roadmap.sort.fgwas.gz 的文件,请使用以下命令:

shopt -s nullglob
substring=.bed.nodup.sortedbed.roadmap.sort.fgwas.gz
for file in *"$substring"*; do
    echo mv -- "$file" "${file/"$substring"}"
done

注意。我将echo 放在mv 前面,这样就不会重命名任何内容;这些命令只会显示在您的终端上。如果您对所看到的内容感到满意,请删除 echo

【讨论】:

    【解决方案2】:

    您的正则表达式实际上并没有比固定模式更通用,但是如果您想让它工作,您需要在每个点之间允许多个小写字符。现在你正在寻找一个,但你可以在每个[[:lower:]] 之后用\+ 修复它

    printf '%s' "$stringZ" | sed -e 's/\([[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.[[:lower:]]\+\.\)//g'
    

    stringZ="META_ALL_whrAdjBMI_GLOBAL_August2016.bed.nodup.sortedbed.roadmap.sort.fgwas.gz.r0-ADRL.GLND.FET-EnhA.out.params"
    

    给我输出

    META_ALL_whrAdjBMI_GLOBAL_August2016.r0-ADRL.GLND.FET-EnhA.out.params
    

    【讨论】:

      【解决方案3】:

      试试这个:

      #!/bin/bash
      for line in $(ls -1 META*);
      do
      f2=$(echo $line | sed 's/.bed.nodup.sortedbed.roadmap.sort.fgwas.gz//')
      mv $line $f2
      done
      

      【讨论】:

      • 这包含比代码行更多的错误。 google 解析 ls 输出,引用 shell 变量,正则表达式元字符并阅读 Chris Johnson 或类似书籍的 Shell Scripting Recipes。
      • 不,它们是基本的,所以如果你不知道这些,那么还有很多你不知道的,所以你真的需要阅读一些介绍性的 shell 编程文本来学习基础知识,而不是仅仅关注这个脚本中的 5 个左右的错误。您也可以像我说的那样通过谷歌搜索找到有关其中一些的信息。最后 - 将您的答案与 @gniourf_gniourf's correct one 进行比较并注意差异。
      猜你喜欢
      • 2018-05-20
      • 2017-02-08
      • 2022-01-03
      • 1970-01-01
      • 2019-08-07
      • 2015-01-13
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多