我有一个像这样的文件:
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 中为“字段”)分隔符,因此在这里我们基本上找到以error code
文本开头的行并用仅列替换原始行$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