读取由换行符分隔的参数

读取由换行符分隔的参数

我有一个脚本,我从标准输入接收数据作为由换行符分隔的参数,说我有

string1,string2
string3,string4

我想单独采取string1,string2string3,string4。但我收到了未知数量的此类行,我的脚本仅读取前两行,然后停止。我尝试\n从标准输入解析,但它不起作用。我应该如何处理这个问题?

我尝试像这样阅读

for i in "$@" 
do 
var1=$(echo "$i" | cut -f2 -d,) 
var2=$(echo "$i" | cut-f2 -d,)
#etc

我实际上想要完成的是说我有一个input.txt包含该类型输入的文件:

string1,string2
string3,string4

如果我这样做,cat input.txt | ./myscript.sh我想获取,无论我有多少行字符串,我都想获取每一行并stringI,stringJ分别从两个变量中提取。

答案1

如果要进行文本处理,那么最明显的是使用awk专门为此设计的(尽管也可以使用perlor )sed

awk -F, '{print "something with "$1" and "$2}'

如果输入是实际的 CSV,它可能具有更复杂的值,例如:

"field, with comma" , "and with
newline", "or ""quotes"""

您可能想要使用perlpython或 一些专用的 csv 解析实用程序。

如果这些字段必须作为 shell 变量提供,因为例如您需要使用这些字段作为参数运行一些特定的命令,那么您需要执行以下操作:

while IFS=, read -r a b rest; do
   something-with "$a" "$b"
done

另请参阅 GNUparallel并行运行:

PARALLEL_SHELL=sh parallel -C, 'something-with {1} {2}'

但要注意 GNUparallel会带来巨大的开销,因此并行化必须是值得的。

shellksh93实际上可以理解 CSV 格式(处理单个字段的引用,如上面的复杂示例)

while IFS=, read -rS a b rest; do
   do-something-with "$a" "$b"
done

答案2

我建议您可以使用带有 -d 选项的 read 来获取多行用户输入。

或使用tr '\n' ' '将新行转换为空格,这是很hacky的。

我不知道一种方法,但你可以使用 tr 将 EOF 转换为新行,这样它将完美地满足你的期望。

如果您需要更多具体信息,请随时发表评论。

答案3

如果(出于某种原因)你想将所有输入行放入一个数组中,在 bash 中你可以使用

readarray -t input_lines

然后每一行都存储为索引数组的一个元素input_lines。是-t从每行中去除换行符。

相关内容