아래 파일의 숫자를 #Mi
.
10번째 "
이후의 숫자 에만 적용됩니다(큰따옴표).
입력 파일
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 1002.47 1018.81 1016.68
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 501.24 509.41 508.34
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi 55.69 56.6 56.48
결과물 파일
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi
"col1" "col2" "col3" "col4" "col5" #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi #Mi
답변1
그리고 sed
:
<your-file sed '
s/"/"\
/10; # add a newline after the 10th "
h; # save a copy
s/.*\n//; # remove everything before the newline
s/[0-9.]\{1,\}/#Mi/g; # replace numbers with #Mi
G; # append saved copy
s/\(.*\)\n\(.*\)\n.*/\2\1/; # put it back together'
사용 perl
(5.14.0 이상 r
대체 플래그):
perl -pe 's{(.*?"){10}\K.*}{$& =~ s/[\d.]+/#Mi/gr}e' < your-file
이전 버전의 경우(그러나 여전히 5.10.0 이상 \K
):
perl -pe 's{(.*?"){10}\K.*}{($r = $&) =~ s/[\d.]+/#Mi/g; $r}e' < your-file
이전 버전의 경우:
perl -pe 's{((?:.*?"){10})(.*)}{
$l = $1; ($r = $2) =~ s/[\d.]+/#Mi/g; $l.$r}e' < your-file
동시에숫자하나 이상의 숫자로 구성된 시퀀스 또는 입니다 .
. 10일 이후의 입력 에서127.0.0.1
이런 일이 발생할 수 있는 경우에 대비하여 패턴이 다른 곳 과 일치하지 않도록 패턴을 다듬고 ...
싶을 수도 있습니다 . 예를 들어, 에서는 앞뒤에 공백이 없는 숫자-점-숫자 일 수 있습니다 ..
"
perl
(?<!\S)\d+\.\d+(?!\S)
귀하의 샘플에서도
perl -pe 's/(?<!\S)\d+\.\d+(?!\S)/#Mi/g' < you-file
10번 이전 부분에는 "
이런게 없기 때문에 충분합니다숫자-점-숫자공백이 아닌 문자로 둘러싸여 있지 않습니다. 그것은 모두 당신이 대체하고 싶은 것과 당신이 넣은 것에서 어떤 일이 일어날 수 있는지에 달려 있습니다.아니요교체를 원합니다.
답변2
perl
다음과 같이 이용하세요 . \n
options 에 의해 제거되기 때문에 해당 줄에 나타나지 않을 큰 따옴표의 10번째 발생을 표시합니다 -l
.
$ perl -lpe '
s/((?:.*?"){10})/$1\n/;
s/(?<!\S)\d+\.\d+(?!\S)(?!.*\n)/#Mi/g;
tr/\n//d;
' file
$ d='[[:digit:]]' f="$d$d*[.]$d$d*" r='#Mi'
$ sed -Ee "
s/\"/&\n/10
:loop
s/(\n.*\s)$f(\s|\$)/\1$r\2/
t loop
s/\n//
" file