【发布时间】:2014-08-26 13:03:35
【问题描述】:
我正在尝试将字符串切入外壳。我想做类似的事情:
cut -d' ' -f1 "hello 12345 xyz"
但问题是 cut 接受一个文件,所以如果我将字符串传递给它,它会尝试打开名为“hello 12345 xyz”的不存在文件,然后尝试剪切其内容
我想用基础程序解决这个问题,所以不要告诉我使用 awk
谢谢!
【问题讨论】:
标签: bash shell sh cut io-redirection
我正在尝试将字符串切入外壳。我想做类似的事情:
cut -d' ' -f1 "hello 12345 xyz"
但问题是 cut 接受一个文件,所以如果我将字符串传递给它,它会尝试打开名为“hello 12345 xyz”的不存在文件,然后尝试剪切其内容
我想用基础程序解决这个问题,所以不要告诉我使用 awk
谢谢!
【问题讨论】:
标签: bash shell sh cut io-redirection
您可以在BASH 中使用Here Strings:
cut -d' ' -f1 <<< "hello 12345 xyz"
hello
【讨论】:
hello 12345 xyz。但你解释正确。
bash 本身有几种方法可以做到这一点。如果您的字符串已经在参数中(或者您不介意将其分配给一个参数,则可以使用read:
str="hello 12345 xyz"
read first rest <<< "$str"
或参数扩展:
echo "${str% *}"
或正则表达式匹配:
[[ "hello 12345 xyz" =~ ([^ ]+)\ ]]
echo "${BASH_REMATCH[1]}"
【讨论】:
要让cut 作用于字符串而不是文件,您必须通过 STDIN 给它字符串。最常见的方法是:
$ echo 'hello 12345 xyz' | cut -f 1
hello
【讨论】:
我不完全了解您是在 shell 脚本中需要它,还是在剪切传递给脚本的参数时需要它,所以我将介绍这两个任务的解决方案。请注意,甚至不需要 cut,因为默认情况下,shell 可以使用内置的 set 执行基于空格的分词。
如果你有字符串在一个shell脚本,
foo="hello 12345 xyz"
set -- $foo
echo $1 # hello
如果字符串被传递作为shell脚本的第一个参数,如script "hello 12345 xyz",
set -- $1
echo $1
【讨论】: