echo -e 在 shell 脚本中工作不正常

echo -e working improperly in shell script

我正在为文件使用以下脚本,其格式如下所示:

    abc efg|hig
    yxf xnc
    xbs xnd|shc|ehc|xoc

我想要这样的输出:

    abc efg
    abc hig
    yxf xnc
    xbs xnd
    xbs shc
    xbs ehc
    xbs xoc

脚本如下:

    while read line
    do
    line1=$(echo "$line" | awk '{print }')
    line2=$(echo "$line" | awk '{print }')
    arr=$(echo $line2 | tr "|" "\n")
    for x in $arr
    do
    echo -e "$x \t$line1\n"
    done
    done < FBC.txt

但是我得到的结果混合了 variables.Something,例如:

    abefgch
    abc hig
    yxxncf
    xxndbs
    xbs shc
    xbehcs
    xbs xoc

尝试将您的意图解释为针对 POSIX sh 的正确脚本(如果您实际上针对的是 ksh、bash 或 zsh,则可以使用数组而不是覆盖参数列表):

#!/bin/sh
set -f

while unset IFS; read -r line1 line2 rest; do
  IFS='|'
  for x in $line2; do
    printf '%s \t%s\n' "$x" "$line1"
  done
done <FBC.txt

重要提示:

  • set -f 使用可以将文件作为通配符匹配的数据使其安全。
  • unset IFS 在第一个 read 之前将输入字段分隔符设置为默认值,用空格或制表符分隔 line1 和 line2 变量。 ("line2" 变量后面的内容进入 "rest" 变量,该变量未被使用。
  • IFS='|' 之后确保 for x in $line2 按管道字符拆分。
  • 使用 printf 而不是 echo 可确保您的脚本不依赖于偏离 POSIX 规范的行为。

你完全可以在 awk 中完成:

#!/usr/bin/awk -f
{
    n = split(, a, "|");
    for (i = 1; i <= n; i++)
        printf("%s %s\n", , a[i])
}