N 번째 문자 발생 후 특정 텍스트 바꾸기

N 번째 문자 발생 후 특정 텍스트 바꾸기

아래 파일의 숫자를 #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다음과 같이 이용하세요 . \noptions 에 의해 제거되기 때문에 해당 줄에 나타나지 않을 큰 따옴표의 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

관련 정보