【问题标题】:How to take string from a file name and use it as an argument如何从文件名中获取字符串并将其用作参数
【发布时间】:2012-10-10 22:06:29
【问题描述】:

如果文件名是这种格式

assignment_number_username_filename.extension

例如

assignment_01_ssaha_homework1.txt

我只需要提取用户名以在脚本的其余部分中使用它。

如何只使用用户名并将其用作参数。

这与我要找的很接近,但不完全是:

Extracting a string from a file name

如果有人能解释 sed 在这种情况下的工作原理,那将同样有帮助!

这是我目前所拥有的;我有一段时间没有使用cut,所以在尝试刷新自己时收到错误消息。

 #!/bin/sh 
 a = $1
 grep $a /home | cut -c 1,2,4,5 echo $a`

【问题讨论】:

  • 我一直坚持尝试这部分代码的其余部分只是使用然后提取的用户名创建新目录并将包含这些用户名的文件移动到相关目录。你知道吗?关于如何使用 sed 命令的说明的好链接?
  • 您只是想从字符串中提取第三个单词吗?查看cut 命令。
  • 是的,这就是主要问题,我只需要稍后能够使用它来执行我在 Jeremy D. 下面的评论中描述的操作,它是否也可以删除扩展程序?
  • 如果你想使用 cut:username = $(echo $filename | cut -d'_' -f 3 想不出更简单的了。 -d 用于将分隔符设置为“_”,-f 用于选择第 3 列
  • 请注意,这是错误的:a = $1 -- 您不能在等号周围放置空格。这样做:a=$1。如果你放了空格,shell 将尝试执行带有参数=$1 的命令a

标签: bash shell


【解决方案1】:

您可能需要命令替换,加上echo 加上sed。您需要知道sed 正则表达式可以记住匹配的部分。你需要知道基本的正则表达式。在上下文中,这加起来是:

filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | sed 's/^[^_]*_[^_]*_\([^_]*\)_[^.]*\.[^.]*$/\1/')

$(...) 表示法是命令替换。括号之间的命令运行,输出被捕获为字符串。在这种情况下,字符串被分配给变量username

sed 命令中,整个命令将特定替换(s/match/replace/)操作应用于每一行输入(此处为一行)。正则表达式的[^_]* 组件匹配一系列(零个或多个)非下划线。 \(...\) 部分记住封闭的正则表达式(第三个非下划线序列,也就是用户名)。最后切换到[^.]* 可以识别分隔符从下划线到点的变化。替换文本\1 将整个名称替换为模式的记住部分。通常,您可以记住该模式的几个小节。如果文件名与模式不匹配,您将获得输入作为输出。

bash中,有一些方法可以避免echo;您很可能能够使用一些更深奥的(意思是“在其他 shell 中不可用”)机制来提取数据。这将适用于大多数现代 POSIX 派生的 shell(Korn、Bash 等)。

【讨论】:

  • 非常感谢,用命令行参数替换filename="assignment_01_ssaha_homework1.txt" 是否安全?
  • @AlecWiese:当然;我只是确保你看到了我正在使用的名字。在您指定下划线分隔组件但随后不在示例名称中显示下划线的问题中还指出了一个可能的问题。如果格式是问题,请记住将示例缩进(至少)4 个空格以获得“代码”格式(等宽字体和下划线作为下划线)。
  • 是的,下划线是必要的,我不知道为什么我在我的操作中忘记了它们。再次感谢您的帮助!
【解决方案2】:
filename="assignment_01_ssaha_homework1.txt"

username=$(echo "$file" | awk -F_ '{print $3}')

【讨论】:

    【解决方案3】:

    只是 bash:

    filename="assignment_01_ssaha_homework1.txt"
    tmp=${filename%_*}
    username=${tmp##*_}
    

    http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2013-11-07
      相关资源
      最近更新 更多