用bash替换文件中的所有x和y字段

时间:2013-03-08 09:55:21

标签: bash field masking

我有一个用冒号分隔的文件,比如这个

1:2:3:4:5:6:7:8:9:10
11:12:13:14:15:16:17:18:19:20

每行中的字段总数相同

我希望能够屏蔽(用*替换字段)该文件每行的第x和第y个字段。假设我想屏蔽第5和第7个字段,以便文件看起来像:

1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

我怎样才能在bash中实现这样的目标?

由于

4 个答案:

答案 0 :(得分:5)

这样的事情让你开始

#!/bin/bash

x=5
y=7

awk -F':' -vX="$x" -vY="$y" 'BEGIN{OFS=FS}{$X="*";$Y="*"}{print}' input

输出:

$ ./fields.sh 
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

答案 1 :(得分:2)

bash解决方案:

#!/usr/bin/bash

while IFS=: read -a arr
do
         arr[4]='*'
         arr[6]='*'
         (IFS=":";echo "${arr[*]}")
done < file

答案 2 :(得分:1)

我会添加一个sed单行。 (忽略bash变量部分,我只使用硬编码值5和7)

sed -r 's/[^:]+:/*:/5;s/[^:]+:/*:/7' file

以你的例子:

kent$  echo "1:2:3:4:5:6:7:8:9:10
11:12:13:14:15:16:17:18:19:20"|sed -r 's/[^:]+:/*:/5;s/[^:]+:/*:/7' 
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

带变量:

sed -r "s/[^:]+:/*:/$X;s/[^:]+:/*:/$Y" file

答案 3 :(得分:0)

使用ed:

 $ printf '%s\n' '1,$ g/./s/\(\([[:digit:]*]*\(:\|$\)\)\{'{4,6}'\}\)[[:digit:]*]*:/\1\*:/' ,p |
 ed -s <(xclip -o)
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20

写出文件。