【问题标题】:Bash appends space at start of line when removing the first n lines of a txt file删除 txt 文件的前 n 行时,Bash 在行首附加空格
【发布时间】:2021-04-03 07:12:31
【问题描述】:

观察结果

在编写一个从文件中删除变量 nr 的函数时,该函数包含 n 行,输出文件在每行的第一个位置(第一行之后)有一个额外的空间。

例如:

some text
another text
third text
fourth text
fifth text

前往:

third text
 fourth text
 fifth text

在删除第一行 n=2 之后。

预期结果

本质上,我打算/期望不添加这些额外的空格:

third text
fourth text
fifth text

代码

执行删除的函数包括:

#!/bin/bash
apt_update() {
    source src/hardcoded_variables.txt

    # copy target file
    cp $INPUT_PATH $REMAINING_LINES_IN_TARGET_AFTER_STARTING_LINE

    # get starting line number
    starting_line=$(<$STARTING_LINE_QUERY_VAR_PATH)
    
    # remove first starting_line lines from the copied target file
    echo -n $(sed "1,${starting_line}d" $REMAINING_LINES_IN_TARGET_AFTER_STARTING_LINE) > $REMAINING_LINES_IN_TARGET_AFTER_STARTING_LINE
}
apt_update "$@"

问题

如何防止在输出文件的第一行之后的每一行的开头添加空格?

【问题讨论】:

  • 删除 echo -n $()?
  • 那个奇怪的 echo/sed/redirect 是怎么回事?使用edsed -i就地修改文件。
  • 一般在bash中ALLCAPS变量是为系统或环境变量保留的。 (更短的描述性名称会使事情更容易阅读)
  • 请参阅mywiki.wooledge.org/…,了解有关您获得空文件的原因的示例和详细信息。
  • 无论如何,你得到了额外的空格,因为你没有引用$(sed ...) 位。请参阅我之前链接中的陷阱之后的下一个陷阱。

标签: bash sed


【解决方案1】:

答案是由 Shawn 作为评论给出的,我使用了 sed 的复杂方法导致错误。此外,我首先制作了一个文件的副本,并尝试将sed 应用于同一个文件。当我第一次制作副本,然后从原始文件传输到复制文件时,目标文件按预期填充。因此,找到了一个可行的解决方案:

#!/bin/bash
apt_update() {
    source src/hardcoded_variables.txt

    # copy target file
    cp $INPUT_PATH $REMAINING_LINES_IN_TARGET_AFTER_STARTING_LINE

    # get starting line number
    starting_line=$(<$STARTING_LINE_QUERY_VAR_PATH)
    
    # remove first starting_line lines from the copied target file
    sed "1,${starting_line}d" $INPUT_PATH > $REMAINING_LINES_IN_TARGET_AFTER_STARTING_LINE
}
apt_update "$@"

在此解决方案中应用sed 之前,我确实需要制作目标副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    相关资源
    最近更新 更多