我有一个用冒号分隔的文件,例如
1:2:3:4:5:6:7:8:9:10
11:12:13:14:15:16:17:18:19:20
ETC
每行中的字段数量始终相同
我希望能够屏蔽(用 * 替换字段)该文件每一行的第 x 和第 y 字段。假设我想屏蔽第 5 个和第 7 个字段,以便文件看起来像:
1:2:3:4:*:6:*:8:9:10
11:12:13:14:*:16:*:18:19:20
我怎样才能在 bash 中实现这样的目标?
谢谢
像这样让你开始
#!/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
一个bash解决方案:
#!/usr/bin/bash
while IFS=: read -a arr
do
arr[4]='*'
arr[6]='*'
(IFS=":";echo "${arr[*]}")
done < file
我会添加一个 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
使用编辑:
$ 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
w 写出文件。