我有一個像這樣的文件:
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
我需要保留帶有時間戳記的行,即171023 03014426 1234 XXXX XXXXXXXX
並保留error code: 123
其他行,即從行首到逗號,並將更改寫入同一個文件。
輸出:
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
我怎樣才能做到這一點?
答案1
據我了解你的問題,你想要這個
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
變成這樣:
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
有很多方法可以做到這一點,因此請選擇您想要/喜歡/喜歡的方法。
sed
$ sed 's/\(error code:[[:blank:]][[:digit:]]*\),.*/\1/' input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
如果您想更改原始文件input.txt
,請使用sed -i
而不是僅僅sed
awk
$ awk -F ',' '/^error code/{$0=$1};1' input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
這種方法使逗號被視為列(在 awk-speak "field" 中)分隔符,所以在這裡我們基本上找到以error code
text 開頭的行,並僅用 column 替換原始行$1
,在您的情況下,這恰好是逗號之前的所有內容,即error code: 123
。
awk
無法進行文字編輯(大多數版本),sed -i
但您始終可以將內容輸出到新文件,並用新文件取代舊文件,例如:
awk -F ',' '/^error code/{$0=$1};1' input.txt > new_data.txt && mv new_data.txt input.txt
純bash
#!/usr/bin/env bash
# make temp file for writing stuff
temp=$(mktemp)
# read input file, make necessary changes, write to temp file
while IFS= read -r line;
do
case $line in
"error code:"*) printf "%s\n" "${line%%,*}" >> "$temp";;
*) printf "%s\n" "$line" >> "$temp";;
esac
done < "$1"
mv "$temp" "$1"
測試運行:
$ # before
$ cat input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
171023 03110749 1234 XXXX XXXXXXXX
error code: 123, pc=546, call=0,
$ # after
$ ./edit_error_codes.sh input.txt
$ cat input.txt
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
答案2
如果您不想觸及的行沒有逗號,並且您總是只想刪除第一個逗號及其後面的所有內容,則可以使用一個非常簡單的表達式
$ sed 's/,.*//' file
171023 03014426 1234 XXXX XXXXXXXX
error code: 123
171023 03110749 1234 XXXX XXXXXXXX
error code: 123
s/old/new/
用old
。new
.*
任意數量的任意字符
就地編輯文件,請使用sed
的就地選項,即-i
.如果在 後面新增備份檔案的後綴-i
,則會自動在同一目錄中寫入具有該副檔名的原始檔案的備份,例如
sed -i 's/,.*//' file
file
用修改後的流覆蓋,但是
sed -i.orig 's/,.*//' file
將修改後的流寫入並寫入包含原始內容的file
新檔案。file.orig
答案3
您可以使用簡單的cut
命令來執行您想要的操作。
cut -d"," -f1 input.txt
將其寫回同一個文件中。
cut -d"," -f1 input.txt | tee input.txt