我有以下字符串:
/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand
我是 Linux 新手。如何使用“|”作为分隔符进行分隔并在变量中分配?我将整个字符串作为参数传递,需要分别拆分\剪切字段。
例如:
function()
{
while read -r record; do
## here i need the fields to cut the fields and assign to a variable #####
done < $0
}
bash -c function "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand"
当我尝试上述示例时,它会引发一个错误$0: ambiguous redirect
。
答案1
您可以使用tr
分隔符进行分隔
在以下示例中,我们替换|
为newline
variable=$(echo "/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand" | tr "|" "\n")
echo $variable
您还可以使用
echo yourtext | tr -d "|"
答案2
除了主要问题之外还有很多问题。
ambiguous redirect
是因为您的代码缺少双引号。- 重定向
<
从文件中获取数据。您的字符串未指向文件(路径)。在 Bash 中,您可以使用从字符串中获取数据<<<
。 function
是保留字。有一种方法可以命名函数function
,但进一步使用不方便。- (您评论中的术语)功能不是孩子。
- 我们通过函数名称来调用它,而不是用
bash -c
。我对你的另一个问题的回答适用。 - 那么第一个参数被称为
$1
,而不是$0
。
这段代码有效,尽管我不确定它是否正是你想要的:
#!/bin/bash
split_string ()
{
readarray -t arrayv < <(tr '|' '\n' <<< "$1")
}
split_string '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand'
# now arrayv is an array variable (indexed from 0)
# retrieving few values
echo "${arrayv[0]}"
echo "${arrayv[5]}"
echo "${arrayv[9]}"
笔记:
- 您用双引号括住了该字符串。请记住,用双引号括住的字符串会进行某些扩展。您的字符串不包含任何会/可以扩展的内容(例如
$
),因此在此特定情况下使用双引号是可以的。通常使用单引号来抑制扩展。 readarray
是 的同义词mapfile
。调用help mapfile
以学习。- 其他研究素材:
<<<
,<( … )
,数组。 - 没有办法将
export
数组变量添加到环境中。 我们可以
readarray
使用|
作为分隔符:readarray -t -d '|' arrayv <<< "$1"
但最后一个“字段”将包含尾随换行符(它会因为
<<<
工作方式而出现)。我使用 将所有分隔符转换为换行符tr
,然后readarray
使用其默认设置(换行符作为分隔符)。空格不属于分隔符,它们成为存储值的一部分。使用
sed
代替tr
将带有相邻空格的分隔符子字符串转换为单个换行符。该readarray …
行将是:readarray -t arrayv < <(sed 's/ *| */\n/g' <<< "$1")
如果你只打算使用一次该函数,那么你根本不需要函数。这行代码(在任何函数之外)可以完成这个任务:
readarray -t arrayv < <(tr '|' '\n' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand')
我定义了一个函数(然后只使用了一次),因为您尝试定义一个函数。
如果您的输入字符串由固定数量的字段组成,并且这些字段有意义,则最好将它们分配给名称有意义的不同(非数组,常规)变量。 例如:
IFS='|' read -r path1 path2 path3 path4 path5 ip path6 wtf1 wtf2 wtf3 extra < <(sed 's/ *| */|/g' <<< '/a585/app/data/CCN_text/CCN_split_files/ccn.email.list.file07 | /svr00c8/n585 | /a585/app/data/CCN_text | /a585/app/data/CCN_text | /a585/app/data/muttrc | 153.2.254.229 | /a001/odbi_land/ondemand/download/scriptload | DVLP | cmodappl | ondemand') echo "$ip" echo "$wtf3"
具体说明:
- 这里我们明确使用
|
作为分隔符。当我们使用 时read
,尾随换行符(由于某些重定向和工具的工作方式而出现)不仅是无害的,而且是必需的。 - 我添加了
extra
变量。如果字段数量超过预期,则多余的字段将占用extra
。如果没有extra
它们,则会影响$wtf3
。 - 您可以使用
export
这些变量。
- 这里我们明确使用
foo|bar|baz|…
如果您要以(或或类似)形式操作包含(许多)记录的文件/流,foo | bar | baz | …
那么请熟悉awk
。