Shell
使用命令輸出附加文本文件,但替換已經存在的單詞(不要兩次添加相同的文本)
我將命令輸出附加到文本文件。但是如果我再做一次,它會在文本文件中有兩次相同的文本。例如 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
當然,問題是為什麼不應該每次都刪除和重新創建文件。