我有一个用冒号分隔的文件,比如这个
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中实现这样的目标?
由于
答案 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
写出文件。