附加带有命令输出的文本文件,但替换已存在的单词(不要添加相同的文本两次)

附加带有命令输出的文本文件,但替换已存在的单词(不要添加相同的文本两次)

我正在将命令输出附加到文本文件。但是如果我再次执行此操作,文本文件中将出现两次相同的文本。例如,有没有一种方法,如果某个单词已经存在,则不添加新单词,而只是替换旧单词?

我正在做的是将 ls 命令的输出附加到文本文件。因此,有时必须将新文件添加到文本文件中,但如果再次附加 ls 输出,则文本文件中已有的文件现在会出现两次。

我希望你明白我的意思。

我正在使用 AWS linux AMI

编辑:

我用了

ls client_certs/ >> message.txt

我还没有使用该sed命令。如果我执行该ls命令两次,那么我会得到双重名称,例如:

  • 第一个之后ls client_certs/ >> message.txt
    1. 2. 3.
    
  • 第二次之后ls client_certs/ >> messages.txt
    1. 2. 3. 1. 2. 3
    

我想要的是:

  • 如果我第一次这样做ls client_certs/ >> message.txt
    1. 2. 3.
    
  • 如果我第二次这样做ls client_certs/ >> message.txt
    1. 2. 3.
    
  • client_certs/如果(例如)中有一个新文件4.并且我想要这样做,ls client_certs/ >> message.txt它应该显示如下:
    1. 2. 3. 4.
    

答案1

touch message.txt # the file must exist even if it is empty
ls client_certs | grep -vxFf message.txt >>message.txt
  • -xF检查整个文字(无正则表达式)行
  • -f message.txt检查文件中的所有行message.txt
  • -v反转匹配,即不是打印文件中的所有内容,而是打印文件中没有的所有内容

删除旧条目

最简单的解决方案是计算目录和文件中的条目。如果数字不同,则删除并重新创建文件:

touch message.txt # the file must exist even if it is empty
ls client_certs | grep -vxFf message.txt >>message.txt
# update the file, then compare
# save some time by trusting mtime
if [ client_certs -nt message.txt ] && [ $(wc -l message.txt) -ne $(ls -U client_certs | wc -l) ]; then
    : >message.txt # set file size to 0
    ls client_certs | grep -vxFf message.txt >>message.txt
fi

当然,问题是为什么不应该每次都删除并重新创建该文件。

相关内容