regex - 如何从管道分隔文件中的特定列中删除前导字符?
问题描述
我有一个像这样的管道分隔文本文件
TEST|F123433|F123433|TEST
TEST|F123434|F123434|TEST
TEST|F123435|F123435|TEST
TEST|F123436|F123436|TEST
TEST|F123437|F123437|TEST
我正在尝试从第 2 列和第 3 列中删除前导“F”。这是预期的输出。
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
我尝试使用如下 sed 来执行此操作,但它仅从第 2 列而不是第 3 列中删除了“F”
sed 's/^TEST|F/TEST|/g'
解决方案
使用sed
(并且这仅适用于所述示例)您可以全局替换|F
为|
:
$ sed -E 's/\|F/\|/g' file
|F
您可以使用两个非全局替换来限制(不一定是列号)的前两个实例sed
:
sed -e 's/\|F/\|/' -e 's/\|F/\|/' file
或者,以 ERE 形式:
$ sed -E 's/^([^|]*)\|F/\1|/; s/([^|]*)\|F/\1|/' file
更好、更灵活的逐字段解决方案awk
允许您指定哪一列:
$ awk 'BEGIN{FS=OFS="|"} {for (i=2; i<=3;i++)sub(/^F/,"",$i);}1' file
TEST|123433|123433|TEST
TEST|123434|123434|TEST
TEST|123435|123435|TEST
TEST|123436|123436|TEST
TEST|123437|123437|TEST
推荐阅读
- docker - 内存争用时,超出软内存限制的 ECS 容器会怎样?
- mongodb - RabbitMQ - 设计重试机制
- http - 如何向不需要回复的服务器发出http请求?
- laravel - 实时服务器中的 laravel 错误
- jenkins - 如何查看 jenkins 管道是否从管道内部的 git 标签运行?
- excel - 如何根据在两列上搜索的字符串更改单元格填充颜色?
- swift - 存储 Swift 函数及其参数值并稍后调用
- python-3.x - 在没有预安装 numpy 的情况下将 numpy.get_include() 参数添加到 setuptools
- bulkinsert - SQL Server 2017:IID_IColumnsInfo 批量插入错误
- botframework - 主动中断