Shell

使用命令輸出附加文本文件,但替換已經存在的單詞(不要兩次添加相同的文本)

  • June 4, 2020

我將命令輸出附加到文本文件。但是如果我再做一次,它會在文本文件中有兩次相同的文本。例如 sed 有沒有辦法,如果一個詞已經存在,不要添加新詞,而只是替換舊詞?

我正在做的是將 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.
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

當然,問題是為什麼不應該每次都刪除和重新創建文件。

引用自:https://unix.stackexchange.com/questions/589486