【问题标题】:How to remove \r using IFS?如何使用 IFS 删除 \r?
【发布时间】:2020-10-10 08:32:17
【问题描述】:

我正在编写如下代码 sn-p:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$v
            ;;
    esac
done 9< <(git show -s --format=%b)

但我看到$v 仍然包含\r。从https://bash.cyberciti.biz/guide/$IFS,我读到A sequence of IFS whitespace characters is also treated as a delimiter. 我不应该从行中删除尾随\r 吗?

【问题讨论】:

  • 如果输入中有超过 2 个字段,则第二个和所有后续字段进入 $v,包括分隔符。
  • 谢谢。有没有一种干净的方法来实现我在这里尝试做的事情?
  • 在进程替换中将git 命令传递给tr -d '\r',然后尝试不使用\rIFS
  • 你确定这是在 bash 下运行的吗?出于某种原因,zsh 在这种情况下似乎没有修剪回车。

标签: bash shell git-bash


【解决方案1】:

由于您正在格式化 git show 的输出,因此在您的 git 格式字符串中使用 null 分隔符 %x00,它永远无法在 shell 变量中捕获:

while IFS=$': \t' read -r -u9 marker v
do
  case $marker in
    Release)
      export RELEASE="$v"
      ;;
  esac
done 9< <( git show -s --format='%b%x00' )

【讨论】:

  • 这是一种解决方法,但不能回答问题
【解决方案2】:

您可以这样更改read

read -r -u9 marker v possibly_something_else;

这样 $v 就不会包含 \r

【讨论】:

    【解决方案3】:

    我使用tr 删除尾随\r。这是我的最终解决方案:

    while IFS=$': \r\t' read -r -u9 marker v; do
        case $marker in
            Release)
                export RELEASE=$(echo $v | tr -d '\r\t')
                ;;
        esac
    done 9< <(git show -s --format=%b)
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 2022-01-20
      • 2021-10-19
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多