【发布时间】:2010-12-30 20:33:58
【问题描述】:
我意识到如何在 python 中做到这一点,只需使用
line = db_file.readline()
ll=string.split(line)
但是我怎样才能在 bash 中做同样的事情呢?真的可以这么简单吗?
【问题讨论】:
-
我认为你的意思是 Python 中的
ll=str.split(line)。
标签: bash
我意识到如何在 python 中做到这一点,只需使用
line = db_file.readline()
ll=string.split(line)
但是我怎样才能在 bash 中做同样的事情呢?真的可以这么简单吗?
【问题讨论】:
ll=str.split(line)。
标签: bash
read 的-a 选项将允许您拆分由$IFS 中包含的字符读取的行。
【讨论】:
filename=$1; while read -a LINE; do echo "$LINE"; done < "$filename"
$ line="these are words"
$ ll=($line)
$ declare -p ll # dump the array
declare -a ll='([0]="these" [1]="are" [2]="words")'
$ for w in ${ll[@]}; do echo $w; done
these
are
words
【讨论】:
s='foo bar baz'
a=( $s )
echo ${a[0]}
echo ${a[1]}
...
【讨论】:
#!/bin/sh 开头),你会得到那个语法错误。如果脚本像bash deploy.sh 那样执行或者第一行更改为#!/usr/bin/env bash,它应该可以工作。
desktop:~$ var="first last" desktop:~$ first_word=${var%% *} # space star ! desktop:~$ echo $first_word first desktop:~$ last_word=${var##* } # star space ! desktop:~$ echo $last_word last
这取决于您所说的拆分是什么意思。如果你想迭代一行中的单词,它在一个变量中,你可以迭代。例如,假设变量line 是this is a line。然后你可以这样做:
for word in $line; do echo $word; done
这将打印:
this
is
a
line
for .. in $var 使用$IFS 中的值拆分$var,其默认值表示“拆分空格和换行符”。
如果你想从用户或文件中读取行,你可以这样做:
cat $filename | while read line
do
echo "Processing new line" >/dev/tty
for word in $line
do
echo $word
done
done
对于其他任何事情,您都需要更加明确并更详细地定义您的问题。
注意:已编辑以删除 bashism,但我仍然保留 cat $filename | ...,因为我更喜欢它而不是重定向。
【讨论】:
cat - 像这样重定向文件:done < "$filename"。此外,在此上下文中使用 for value in "${var[@]}" 而不是索引变量。虽然在这种情况下数组可能是连续的,但 Bash 支持稀疏数组,${#var[@]} 可能不是最后一个条目(尽管${var[@]: -1} 将是,indices=(${!a[@]}); count=${#indices[@]} 将给出索引列表和正确的计数)
如果你已经在变量 $LINE 中有你的文本行,那么你应该可以说
for L in $LINE; do
echo $L;
done
【讨论】:
这样做
while read -r line
do
set -- $line
echo "$1 $2"
done <"file"
$1、$2 等将是您的第一个和第二个拆分“字段”。使用 $@ 获取所有值。使用 $# 获取“字段”的长度。
【讨论】:
$line 包含例如*,这将在执行set -- $line 时被 bash 扩展,这会产生惊人的效果。
如果您想从该行中获取特定单词,awk 可能会很有用,例如
$ 回声 $LINE | awk '{打印 $2}'打印 $LINE 中的第二个空格分隔的单词。您还可以拆分其他字符,例如
$ echo "5:6:7" | awk -F: '{打印 $2}' 6【讨论】:
echo "5::6:7" | awk -F:: '{print $2}' 6:7 (与剪切不同,它只需要一个字符作为分隔符)
更简单,
echo $line | sed 's/\s/\n/g'
\s --> 空白字符(空格、制表符、NL、FF、VT、CR)。在许多 系统也有效 [:space:]
\n --> 换行
【讨论】:
echo $line | tr " " "\n"
给出的输出类似于上面大多数答案的输出;不使用循环。
在您的情况下,您还提到了ll=<...output...>,
所以,(鉴于我不太了解 python 并假设您需要将输出分配给变量),
ll=`echo $line | tr " " "\n"`
应该足够了(记住echo "$ll"而不是echo $ll)
【讨论】: