在 Linux 中如何使用分隔符分隔子字符串?

在 Linux 中如何使用分隔符分隔子字符串?

我有以下字符串:

/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 "|"

tr 命令

答案2

除了主要问题之外还有很多问题。

  1. ambiguous redirect是因为您的代码缺少双引号
  2. 重定向<从文件中获取数据。您的字符串未指向文件(路径)。在 Bash 中,您可以使用从字符串中获取数据<<<
  3. function是保留字。有一种方法可以命名函数function,但进一步使用不方便。
  4. (您评论中的术语)功能不是孩子。
  5. 我们通过函数名称来调用它,而不是用bash -c我对你的另一个问题的回答适用。
  6. 那么第一个参数被称为$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

相关内容