如何获取字符串的第一个单词?

vde*_*nne 84 bash string

当我echo * 得到以下输出时:

file1 file2 file3 ...
Run Code Online (Sandbox Code Playgroud)

我想要的是挑出第一个词。我该如何继续?

Ban*_*uin 102

您可以通过 awk 将其通过管道传输并使其与第一个单词相呼应

echo * | head -n1 | awk '{print $1;}'
Run Code Online (Sandbox Code Playgroud)

或者您将字符串剪断并选择第一个单词:

echo *  | head -n1 | cut -d " " -f1
Run Code Online (Sandbox Code Playgroud)

或者你把它通过 sed 管道并让它删除除第一个单词之外的所有内容

echo * | head -n1 | sed -e 's/\s.*$//'
Run Code Online (Sandbox Code Playgroud)

添加了| head -n1以满足挑剔者。如果您的字符串包含换行符,| head -n1则在重要命令从传递给它的字符串中选择第一个单词之前,将首先选择第一行。

  • 我想知道 `echo *` 生成多少行 (3认同)
  • 将返回每一行的第一个单词,而不是第一个单词。 (2认同)
  • 这取决于有多少文件在其名称中包含换行符,或者取决于环境或 bash 的编译方式,或者某个名为 `-e` 或 `-ee` 的文件是否出现在列表中,`\n` 出现了多少次出现在文件名中。如果有一个名为 `-n` 的文件,它甚至可能根本不返回任何行... (2认同)
  • 5点全部错误。在空目录中尝试:`touch '$a\nb' 'a\nb'; env BASHOPTS=xpg_echo bash -c 'echo * | wc -l'` (只要 `bash` 需要与 Unix 一致,就会启用 `xpg_echo`)。在另一个空目录中:`touch ./-n; bash -c '回声* | wc-l'`。行是由换行符终止的字符序列。如果 `echo` 不输出换行符,则它不会输出任何行。如果输入在最后一个换行符之后有额外的字符,则文本实用程序(如“cut”、“awk”或“sed”)的行为是未指定的,并且行为因实现而异。 (2认同)

sta*_*fry 40

假设有一个 posixy shell(/bin/sh或者/bin/bash可以这样做)

all=$(echo *)
first=${all%% *}
Run Code Online (Sandbox Code Playgroud)

该构造${all%% *}子字符串删除的示例。这%%意味着*从变量 的右侧删除最长的匹配项(一个空格后跟任何内容)all。您可以在此处阅读有关字符串操作的更多信息。

此解决方案假定分隔符是一个空格。如果您使用文件名执行此操作,则任何带有空格的都会破坏它。

  • IMO、head、cut 和 sed 不那么简单。当内置参数替换有效地完成工作时,为什么要产生另一个工具。这个答案是挑选空格分隔单词列表中第一个单词的最有效和最便携的方式(这是所有 OP 要求的)。 (11认同)

Chr*_*own 10

假设您真的想要第一个文件名而不是第一个word,这里有一种不会中断空格的方法:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
Run Code Online (Sandbox Code Playgroud)

  • 和 `files=$(echo *); echo ${files%% *}` (3认同)
  • 第一个词也很简单:`files=($(echo *))` (2认同)
  • 它会在“-n”、“-e”、“-ne”、“-Enenene”...上中断,并且取决于`bash` 的编译方式或环境,可能是反斜杠字符。 (2认同)
  • @HaukeLaging,您需要禁用通配符。比如:`text=$(echo *); 设置 -f; files=($text)`,否则可以扩展更多通配符。 (2认同)

gle*_*man 8

您可以使用位置参数

set -- *
echo "$1"
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这会破坏脚本的任何其他参数,除非在辅助范围内运行。如果目录中没有文件,它也会扩展为 `*`。 (3认同)