【问题标题】:How to append new lines of text to the end after cat'ing multiple line file into variable将多行文件转换为变量后如何将新的文本行附加到末尾
【发布时间】:2013-11-15 04:57:13
【问题描述】:

我有一个文件,内容如下:

aaa bbb
ccc ddd
eee fff

如果我将文件放入变量中:

var=`cat file.txt`

我可以像这样回显内容:

echo $var
aaa bbb ccc ddd eee fff

或者像这样,保留换行符:

echo "$var"
aaa bbb
ccc ddd
eee fff

我想在变量 $var 中添加新的文本行,这样当我将 $var 写回文件时:

echo "$var" > newfile.txt

newfile.txt 的内容最后会有我的换行符:

var2=`cat newfile.txt`
echo "$var2"
aaa bbb
ccc ddd
eee fff
ggg hhh
iii jjj

我不知道该怎么做。 谢谢。

【问题讨论】:

  • 如果你只做var=$var$(cat newfile)呢?

标签: shell unix terminal sh


【解决方案1】:
$ var2=$(< file.txt)
$ var2+=$'ggg hhh\niii jjj\n'
$ echo "$var2" > newfile.txt
$ cat new file.txt
aaa bbb
ccc ddd
eee fff
ggg hhh
iii jjj

+= 运算符可用于将值附加到现有参数的末尾。您也可以放弃修改var2 的值,只需像这样编写您的附加数据:

$ var2=$(< file.txt)
$ { echo "$var2"
>   printf "%s\n" "ggg hhh" "iii jjj"
> } > newfile.txt

一些更新以避免bash 扩展。

  1. $(&lt; file.txt) 是标准 $(cat file.txt) 的更高效实现。
  2. $'...' 不受 dash 支持,但嵌入的换行符仍然可以工作:

    var2="$string1
    $string2"
    
  3. printf "%s\n" "$string1" "$string2" 在 dash 中应该可以正常工作。

【讨论】:

  • 我不得不稍作改动。我要添加的内容并不是像“iii jjj”这样真正固定的字符串,而是变量。所以我必须这样做: var2+=$'\n'"${string1} ${string2}" 变量需要在 "" 中,而 \n 需要在 '' 中。
  • 我发现这在 /bin/bash 中有效,但在 /bin/sh 中无效(我认为这是我的操作系统上的破折号)
【解决方案2】:

与其进行赋值然后将数据附加到变量,不如在进行初始赋值时做你想做的事情:

var=$( cat file.txt; echo ggg hhh; echo iii jjj; )

或

var=$( cat file.txt - << EOF
ggg hhh
iii jjj
EOF
)

【讨论】:

  • 就我而言,在初始分配中不可能全部完成。我需要读入一个大文件,经过很多逻辑,我会定期附加到变量中,最后(如果有变化)写出新文件。
【解决方案3】:
$ var="$var
> xxx yyy
> zzz ggg"

$ echo $var
aaa bbb
ccc ddd
eee fff
xxx yyy
zzz ggg

【讨论】:

  • 我在发布我的问题后发现这很有效,但是写入 shell 脚本有点笨拙。我认为它对空格很敏感,即我不能将第 2 行和第 3 行缩进。
【解决方案4】:

你只是在附加模式下回显它

echo "$var" >> newfile.txt

>> 表示它不会以纯写模式打开文件。它在 O_RDRW | 中打开O_APPEND

【讨论】:

  • 我想避免多个文件写入。
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多