【问题标题】:Extract part of filename提取文件名的一部分
【发布时间】:2012-04-23 06:30:37
【问题描述】:

我有多个类似的文件名;

com.test.app1.deb

com.heavy.test.app2.deb

com.maybe-test.app3.deb

com.crazy.app-4.deb

我只想获取粗体字符串。 到目前为止,我已经有了这个,

name=$(echo $file | sed 's!\(*.\)\(.*\).deb!\2!')

编辑: 我在同一个目录中有其他文件,它们的名称类似于;

com.company.名称_1.0.2_arm.deb

目前,我的代码如下所示;

for file in *.deb; do
 name=$(echo "$file" | sed 's/^.*\.\([^.][^.]*\)\.deb$/\1/')
 echo $name
done

【问题讨论】:

标签: linux replace sed extract filenames


【解决方案1】:

您需要负匹配,以便可以从要捕获的字符串部分中排除点。我还锚定了字符串,这样您就不会对 com.deboop.foo.deb 这样的名称感到意外。

name=$(echo "$file" | sed 's/^.*\.\([^.][^.]*\)\(_[-.0-9][-.0-9]*_arm\)*\.deb$/\1/')

(已编辑以反映 cmets)

【讨论】:

  • 显然,有些文件的名称类似于 com.coy。 name _0.01_arm.deb 在同一个目录下,这些怎么样?
  • _s 是名称的一部分吗?另外,我建议您找到一个正则表达式资源并学习如何自己构建这些资源,而不是依赖其他人为您构建这些资源。但正如所写:^.*\([^.][^.]*\)\(_[0-9][0-9]*\.[0-9][0-9]*_arm\)*\.deb$.
  • 我了解基础知识,但是当它进入这些阶段时,真的很难理解,但我正在努力。 :)
  • 抱歉,这个问题有歧义;我在问他们是为了强调还是作为原始文件名中的实际字符。
  • 它们作为字符存在于文件名中。有些文件看起来像 org.test。 应用程序 _1.2.3-4_arm.deb
【解决方案2】:
$> cat text
com.test.app1.deb
com.heavy.test.app2.deb
com.maybe-test.app3.deb
com.crazy.app-4.deb

$> sed -r "s/.*\.([^\.]*)\.deb$/\1/" ./text
app1
app2
app3
app-4

【讨论】:

  • +1 但我认为 . 不需要在字符类中使用反斜杠。
【解决方案3】:
pearl.238> cat file1
com.test.app1.deb
com.heavy.test.app2.deb
com.maybe-test.app3.deb
com.crazy.app-4.deb
pearl.239> awk -F. '{print $(NF-1)}' file1
app1
app2
app3
app-4
pearl.240> 

您应该在脚本中使用以下内容。

name=$(echo $file |awk -F. '{print $(NF-1)}')

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多