如何在文件的开头附加 STDIN 中的文本

如何在文件的开头附加 STDIN 中的文本

我正在努力调试某种问题尼克斯基于 Debian 的操作系统上的 Linux 安装程序脚本

就像所说的那样这里,这个片段/etc/bash.bashrc

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

会使一些 Nix 命令无效,因为有些命令在非交互式 shell 中运行,因此需要在该片段之前获取它

我想出了该命令作为示例,它在出现单个异常时运行得很好

sudo sed -i '1i source /etc/profile.d/nix.sh' /etc/bash.bashrc

在Nix脚本中,init函数已经由函数提供shell_source_lines(),并通过管道传输到configure_shell_profile()函数的tee -a命令,因此它正在附加文件,我需要它附加开头,同时保持管道

shell_source_lines() {
    cat <<EOF

# Nix
if [ -e '$PROFILE_NIX_FILE' ]; then
  . '$PROFILE_NIX_FILE'
fi
# End Nix

EOF
}

configure_shell_profile() {
    for profile_target in "${PROFILE_TARGETS[@]}"; do
        if [ -e "$profile_target" ]; then
            _sudo "to back up your current $profile_target to $profile_target$PROFILE_BACKUP_SUFFIX" \
                  cp "$profile_target" "$profile_target$PROFILE_BACKUP_SUFFIX"
        else
            # try to create the file if its directory exists
            target_dir="$(dirname "$profile_target")"
            if [ -d "$target_dir" ]; then
                _sudo "to create a stub $profile_target which will be updated" \
                    touch "$profile_target"
            fi
        fi
# What I need to modify :
        if [ -e "$profile_target" ]; then
            shell_source_lines \
                | _sudo "extend your $profile_target with nix-daemon settings" \
                        tee -a "$profile_target" # Needs to be replaced
        fi
    done
}

我找不到在文件前面添加 STDIN 文本的方法,有办法做到这一点吗?

答案1

将此命令替换为 GNU sed 版本。

tee -a "$profile_target" 
sed -i -e '1r /dev/stdin' -e '1N' "$profile_target"
  • 假设输入至少 2 行。

答案2

cat /dev/stdin file.txt

从 stdin 获取输入并将其写入 stdout,然后是file.txt.

例如, if file.txtcontains (行号仅用于说明,不是文件内容的一部分)

1  This is some text in the
2  text file. 
3  It has three lines.

然后

echo "Prepended text line" | cat /dev/stdin file.txt > combined.txt

结果文件combined.txt包含

1  Prepended text line
2  This is some text in the
3  text file. 
4  It has three lines.

答案3

在文件开头添加行并不像听起来那么容易,并且通常sed -i在幕后使用临时文件(就像所做的那样)。

cat > data.new && mv data.new "$profile_target"

或者为了更快的解决方案,但这需要外部工具(sponge来自moreutils):

cat - "$profile_target" | sponge "$profile_target"

笔记:

  • 这不会检查输入是否为空(来自标准输入),因为如果是,它将在文件开头添加空格/空白。

  • 这也不会产生任何类型的处理错误。因此,请确保您对使用此文件的任何文件进行了备份,或者使用更安全的方法。

参考:如何将行/文本添加到文件的开头

相关内容