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 中为“字段”)分隔符,因此在这里我们基本上找到以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

相关内容