3

このようなコロンで区切られたファイルがあります

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

4 に答える 4

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
于 2013-03-08T10:01:00.530 に答える
2

bash ソリューション:

#!/usr/bin/bash

while IFS=: read -a arr
do
         arr[4]='*'
         arr[6]='*'
         (IFS=":";echo "${arr[*]}")
done < file
于 2013-03-08T10:23:16.273 に答える
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
于 2013-03-08T10:23:09.280 に答える
0

エドの使用:

 $ 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 ファイルを書き出します。

于 2013-03-08T12:28:45.800 に答える