删除shell中每行中特定字符的前n个出现之间存在的所有字符

时间:2014-09-12 08:48:32

标签: shell unix sed

假设我的txt文件包含如下字符:

   abcd|123|kds|Name|Place|Phone
   ldkdsd|323|jkds|Name1|Place1|Phone1

我想删除|前三次出现的每一行中的所有字符每一行中的字符。我希望我的输出为:

     Name|Place|Phone
     Name1|Place1|Phone1

有人能帮我解决这个问题吗?我如何使用sed实现这一目标?

5 个答案:

答案 0 :(得分:4)

这将是cut

的典型任务
cut -d'|' -f4- file

输出:

Name|Place|Phone
Name1|Place1|Phone1

-f4-意味着你想从第四场到最后。如果您有不同的要求,请调整4

答案 1 :(得分:1)

你可以试试下面的sed commad,

$ sed -r 's/^(\s*)[^|]*\|[^|]*\|[^|]*\|/\1/g' file
   Name|Place|Phone
   Name1|Place1|Phone1
  • ^(\s*)捕获所有开头的空格。
  • [^|]*\|[^|]*\|[^|]*\|匹配第三个|。因此,此abcd|123|kds|将匹配。
  • 所有匹配的字符都被第一个捕获组中的字符替换。

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed 's/^\([^|]*|\)\{3\}//' file

或更可读:

sed -r 's/^([^|]*\|){3}//' file

答案 3 :(得分:0)

sed 's/\(\([^|]*|\)\{3\}\)//' YourFile

这是一个posix版本,在GNU sed force --posix上由于使用|被解释为“OR”而不是posix版本。

<强>释

替换[任何charcater,但\{3\}后面的||)]的第一次出现(\([^|]*|\))为空(//一个空模式)

答案 4 :(得分:0)

您可以打印最后3个字段:

awk '{print $(NF-2),$(NF-1),$NF}' FS=\| OFS=\| file
Name|Place|Phone
Name1|Place1|Phone1