sed

sed

我有一個像這樣的文件:

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 codetext 開頭的行,並僅用 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/oldnew
  • .*任意數量的任意字符

就地編輯文件,請使用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

相關內容