如何读取 bash 中的行并用指定的分隔符分隔它们? [复制]

Posted

技术标签:

【中文标题】如何读取 bash 中的行并用指定的分隔符分隔它们? [复制]【英文标题】:How to read lines in bash and delimit them by a specified delimiter? [duplicate] 【发布时间】:2015-12-03 00:17:19 【问题描述】:

我需要编写一个具有以下行为的脚本:

$ echo $'one&some text\ntwo&other text' | ./my_script.sh --delimiter &
Line:
1st: one
2nd: some tex
Line:
1st: two
2nd: other text

也可以使用默认分隔符\t

$ echo $'one\tsome text\nfive\tother text' | ./my_script.sh

输出应该和上面一样。

脚本应该通过标准输入接受输入。

最简单的方法是什么?可能在纯 bash 中。

我尝试过这种方法,但它不起作用,我不知道为什么:

while read -r line
do
    echo "$line"
    IFS=$DELIMITER
    arr=($line//$DELIMITER/ )
    echo $arr[0]
    echo $arr[1]
done

【问题讨论】:

【参考方案1】:

求救...

 echo -e "one&some text\ntwo&other text" | awk 
     `BEGIN 
         n=spit("st,nd,rd,th",s,",")
       
        print "Line: "; 
         c=split($0,r,"&");  
         for(i=1;i<=c;i++) 
             print i s[(i%10)%n] ": " r[i]
      

会给

Line: 
1st: one
2nd: some text
Line: 
1st: two
2nd: other text

请注意,这个简单的后缀查找将分解为 11-13

【讨论】:

【参考方案2】:

您可以在 bash 中完成此操作,而无需使用外部程序。

$ cat script.sh
#!/bin/bash
if [ "$1" = "--delimiter" ]
then
  d=$2
else 
  d=$'\t'
fi

while IFS="$d" read -r first rest; do
  echo "1st: $first"
  echo "2nd: $rest"
done 
$ echo $'one\tsome text\nfive\tother text' | ./script.sh
1st: one
2nd: some text
1st: five
2nd: other text
$ echo $'one&some text\nfive&other text' | ./script.sh --delimiter \&
1st: one
2nd: some text
1st: five
2nd: other text

请注意,与符号必须转义(或引用),否则它将在后台执行命令。

【讨论】:

以上是关于如何读取 bash 中的行并用指定的分隔符分隔它们? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式从带有空格分隔符和描述中的空格的行中读取发票行详细信息

正则表达式提取数字并用千位分隔符对它们进行分组

如何从具有相同 id 的多行中选择仅一行的值并用 - 分隔它们? [复制]

在 Spark 中读取最后一列作为值数组的 CSV(并且值在括号内并用逗号分隔)

如何通过特定的行分隔符读取文本文件?

如何转换由 | 分隔的顺序数据并且在 pyspark 中的行和列中没有换行符