Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本中使用空格拆分句子_Bash_Shell_Ubuntu - Fatal编程技术网

在bash脚本中使用空格拆分句子

在bash脚本中使用空格拆分句子,bash,shell,ubuntu,Bash,Shell,Ubuntu,如何使用空格分割句子,并从第二个单词开始打印 例如,如果我的句子是Hello World Good Morning,那么我想打印如下: World Good Morning 使用切割: $ echo "Hello World Good Morning" | cut -d' ' -f2- World Good Morning 这告诉cut根据delimiter空格进行“剪切”(令人惊讶),并从第二个字段一直打印到最后 使用sed: $ echo "Hello World Good Morni

如何使用空格分割句子,并从第二个单词开始打印

例如,如果我的句子是
Hello World Good Morning
,那么我想打印如下:

World
Good
Morning
使用
切割

$ echo "Hello World Good Morning" | cut -d' ' -f2-
World Good Morning
这告诉
cut
根据
d
elimiter空格进行“剪切”(令人惊讶),并从第二个字段一直打印到最后


使用
sed

$ echo "Hello World Good Morning" | sed 's/^[^ ]* //'
World Good Morning
这将从行首(
^
)获取一个不包含空格(
[^]*
)的字符块,然后获取一个空格,并将其替换为空内容。这样,第一个单词就被删除了


使用纯
bash

$ while IFS=" " read -r _ b; do echo "$b"; done <<< "Hello World Good Morning"
World Good Morning
sentence="Hello World Good Morning"
IFS=" "
set -- $=sentence
shift
printf '%s\n' "$@"

这将用空字符串替换1块
非空格字符
+一块
空格

您可以使用拆分+全局运算符:

$ more good
Hello World Good Morning

$ perl -p -e 's:Hello W:w:g;s: :\n:g' good 
world
Good
Morning

perl -p -e # Inline edit

's:Hello W:w:g #look for Hello followed by a space and the letter W, replace it with w

;s: :\n:g' # After you replace it, find any spaces and replace with a newline
sentence="Hello World Good Morning"
set -f # disable the glob part
IFS=" " # split on space characters:
set  -- $sentence # apply the split+glob operator
                  # (leaving a variable expansion unquoted)
现在,
$1
包含
Hello
<代码>4美元
包含
早晨

shift 1 # (or just "shift") shifts the positional parameters by 1
printf '%s\n' "$@" # print them
请注意,它在空格字符序列上拆分,并忽略前导字符和尾随字符

除了
zsh
,上述功能适用于任何Bourne-like或POSIX shell,而不仅仅是
bash
。使用
zsh
,除非在sh仿真中,否则变量展开时没有隐式split+glob运算符。有一个显式拆分
$=var
和显式glob
$~var
运算符。因此在
zsh
中:

$ while IFS=" " read -r _ b; do echo "$b"; done <<< "Hello World Good Morning"
World Good Morning
sentence="Hello World Good Morning"
IFS=" "
set -- $=sentence
shift
printf '%s\n' "$@"
或:

zsh
还具有变量扩展标志,包括在给定字符串上拆分的
s
标志,以及比在其他shell中嵌套变量扩展更一致的方式,因此:

$ printf '%s\n' ${${(s: :)sentence}[2,-1]}
World
Good
Morning

如果您的grep支持
-p
选项,那么这只能通过grep实现

grep -oP '(?:^\S+|(?<!^)\G)\h*\K\S+'

grep-oP'(?:^\S+|)(?您可以将记录分隔符更改为awk中的空格,并从第二条记录开始打印:

$ awk 'NR>1' RS=' ' <<<"Hello World Good Morning"
World
Good
Morning
或者,根据建议,您可以使用
printf
而不是
echo
将变量传递给awk:

printf '%s' 'Hello World Good Morning' | awk 'NR>1' RS=' '

一个特定于bash的示例:

$ read -ra words <<< "Hello World Good Morning" && printf "%s\n" "${words[@]:1}"
World
Good
Morning

$read-ra words如果要在单独的行上打印,可以使用
tr

echo "Hello World Good Morning"|tr ' ' '\n'
要从第二个字开始打印,请执行以下操作:

echo "Hello World Good Morning"|tr ' ' '\n'|tail -n+2

预期输出是单词+新行+单词…?还是空格分隔?为什么你会这样发布预期输出?这里所有精彩的答案都只针对上面的预期输出。不确定这是否是OP部分的拼写错误,但他的输出有小写字母w,而且他的输出在每个单词后都有一个新行。嗨,这两个都很好。你能告诉我是什么吗发生在sed的//^[^]*/'
@UvaisIbrahim当然!看到我的更新,我正在写它。哦@jaypal你无处不在:DStephane,你的意思是:({:;};printf?;)禁用全球化是个好主意。Shellshock先生,因为你我们做了很多工作;)谁发明了Shellshock这个名字?
Shellshock先生
,apt name。为什么它在最后显示一个空行?因为输入的末尾包含一个换行符,
print
也会添加一个换行符。或者你也可以使用
printf“Hello World Good Morning”| awk'NR>1'RS='
@glenn我刚要提到这一点,我现在已经编辑了。@fedorqui也是一个很好的建议,尽管我认为通常使用格式说明符是个好主意。谢谢,我已经编辑过了,把它包括进去。假设这个句子不包含换行符,并且IFS要么未设置,要么包含空格(默认情况下,或者未设置时,也会在选项卡上拆分)。将
read-a
替换为
read-a
,使其在ksh93或zsh中工作<代码>
echo "Hello World Good Morning"|tr ' ' '\n'
echo "Hello World Good Morning"|tr ' ' '\n'|tail -n+2