문자열 패턴의 모든 발생을 문자열이 발견 된 순서에 따라 문자열과 일치하는 숫자로 바꾸는 방법

레몬 그랩 백작

<>인덱스 카운터의 현재 값 (처음에는 0)으로 바꾸고 카운터를 증가시키기 전에 찾지 못한 문자열 을 찾은 경우 내부의 문자열을 검색하는 bash 스크립트가 필요합니다 . 내부 <>에서 이미 알고 있는 문자열을 찾으면 해당 문자열 의 색인을 찾아 색인으로 대체해야합니다. 이는 여러 파일에 걸쳐 수행되어야합니다. 즉, 프로그램 시작시에만 여러 파일에서 패턴을 검색 할 때 카운터가 재설정되지 않습니다.

file_a.txt :

<abc>
<b>
<c>
<c>
<abc>

file_b.txt :

<c>
<b>

될 것

file_a.txt :

0
1
2
2
0

file_b.txt :

2
1

지금까지 얻은 것 :

names=()
for file in folder/*.txt
do
    name=$(sed 's/\<[a-zA-Z]*\> /\1 /' file)
    for i in "${names[@]}"
    do
        if [ "$i" -eq "$name" ]
        then
            #replace string with index of string in array
        else
            names+=("$name")
        fi
    done
done

편집 : 문제를 단순화하기 위해 언급하지 않은 것은 교체해야하는 패턴이 파일 내부의 유일한 텍스트가 아니라는 것입니다. 즉, 파일이 다음과 같이 보입니다.
file_a.txt :

123abc<abc>xyz
efg
<b>ah
a<c>
<c>b
c<abc>

file_b.txt :

xyz<c>xyz
xyz<b>xyz

될 것

file_a.txt :

123abc0xyz
efg
1ah
a2
2b
c0

file_b.txt :

xyz2xyz
xyz1xyz

파일이 상당히 클 수 있으므로 복사해서는 안되며 편집 만하면됩니다. 이 작업은 폴더 내의 모든 파일과 하위 폴더의 파일에 대해 수행해야합니다.

아누 바바

이 awk 스크립트를 시도해 볼 수 있습니다.

mkdir -p tmp

awk 'match($0, /<[^>]+>/) {
   k = substr($0, RSTART, RLENGTH)
   if (!(k in freq))
      freq[k] = n++
   $0 = substr($0, 1, RSTART-1) freq[k] substr($0, RSTART+RLENGTH)
}
{
   print $0 > ("tmp/" FILENAME)
}' file_{a,b}.txt

수정 된 파일은 tmp/디렉토리에 저장되며 내용을 검토 한 후 다시 이동할 수 있습니다.

cat tmp/file_a.txt

123abc0xyz
efg
1ah
a2
2b
c0

cat tmp/file_b.txt

xyz2xyz
xyz1xyz

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관