Sed替换为可变长度

时间:2018-03-10 03:54:36

标签: bash sed

我有一个.txt文件,每个新行上的[]之间标有日期和时间,然后是事后的其他文本。我想在时间戳和名称之后只保留文本,那么我如何使用sed替换在bash中编码呢? 时间戳具有不同的字符长度,名称也是如此。

所以输入将是 -

[11/26/17, 9:08:01 AM] Sean: sample text sample text
[8/8/18, 10:54:23 AM] Keith: sample sample sample
[3/8/18, 6:40:25 AM] John Doe: more text more text more text
[12/8/18, 12:40:30 AM] Jane Doe: abcd 1234 text text

期望的输出:

sample text sample text
sample sample sample
more text more text more text
abcd 1234 text text

3 个答案:

答案 0 :(得分:2)

解决方案1: 以下awk解决方案可能对您有帮助。

awk '{sub(/.*: /,"")} 1'    Input_file

解决方案第二: 如果您想将输出保存到Input_file本身,那么以下内容可能对您有帮助。

awk '{sub(/.*: /,"")} 1'  Input_file > temp_file && mv temp_file Input_file

解决方案3: 如果您想要备份Input_file并将输出保存到Input_file本身,那么以下内容可能对您有帮助。

sed -i.bak 's/.*: //'   Input_file

答案 1 :(得分:0)

sed

的解决方案

假设您的文本文件名为sample.txt,您可以这样做:

$ sed 's/.*: //' sample.txt 
sample text sample text
sample sample sample
more text more text more text
abcd 1234 text text
$

或者像这样:

$ cat sample.txt | sed 's/.*: //'
sample text sample text
sample sample sample
more text more text more text
abcd 1234 text text
$

sed命令的说明:

sed命令位于单引号'之间,因此其字符不会被解释为shell特殊字符,在本例中为*

s/patter_to_substitute/substitute_with_this/ s是sed替换命令。它将前两个/之间的正则表达式匹配的内容替换为第二个和第三个/之间的内容。所以它会替换.*:匹配的内容,因为第二个和第三个/之间没有任何内容。

.*:匹配任何字符(.)零次或多次(*),直到冒号后跟空格(:)。

答案 2 :(得分:0)

您是否尝试过使用剪切工具?以下命令应该起作用:

cat <file> | cut -d':' -f2