문자열의 문자를 하나씩 변경하는 방법은 무엇입니까?

문자열의 문자를 하나씩 변경하는 방법은 무엇입니까?

문자열의 모든 문자를 교체 규칙에 따라 하나씩 변경하고 Linux에서 파일에 저장하고 싶습니다.

대체 파일(sub.txt)입니다.

A -> Y
B -> V
C -> Q
...

입력 파일:

ABCDEFGHIJ

먼저 (A to Y) YBCDEFGHIJ-> 파일 저장

둘째, (B to V) AVCDEFGHIJ-> 파일 저장

어떤 접근 방식을 취해야 합니까?

답변1

이것을 제공합니다 sub.txt:

$ cat sub.txt 
A -> Y
B -> V
C -> Q
D -> K
E -> L
F -> O
G -> P
H -> W
I -> X
J -> Z

셸 루프에서 반복하여 각 줄의 세 요소를 변수로 읽을 수 있습니다.

while IFS=' ' read -r from ignore to; do ... ; done < sub.txt

while루프 에서 는 $from소스 문자이며 $to바꾸려는 문자입니다. 가운데에 있는 것은 $ignore단지 브래킷입니다 ->.

이는 음역하려는 문자 목록에 공백과 개행 문자( ' '및 )가 없다고 가정합니다.\n

이를 염두에 두고 tr다음을 사용하여 변경하고 출력을 새 파일로 리디렉션할 수 있습니다.

while IFS=' ' read -r from discard to; do 
    printf '%s\n' "$string" | tr "$from" "$to" > changed."$from".txt
done < sub.txt 

tr멀티바이트 문자인 경우 일부 구현은 실패합니다. 위의 내용도 그렇지 않다고 가정합니다.$from$to[$from/

경우 string="ABCDEFGHIJ"위 명령은 다음 파일을 생성합니다.

$ ls changed*
changed.A.txt  changed.D.txt  changed.G.txt  changed.J.txt
changed.B.txt  changed.E.txt  changed.H.txt
changed.C.txt  changed.F.txt  changed.I.txt

다음 콘텐츠가 포함되어 있습니다:

$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
AVCDEFGHIJ
=== changed.C.txt ===
ABQDEFGHIJ
=== changed.D.txt ===
ABCKEFGHIJ
=== changed.E.txt ===
ABCDLFGHIJ
=== changed.F.txt ===
ABCDEOGHIJ
=== changed.G.txt ===
ABCDEFPHIJ
=== changed.H.txt ===
ABCDEFGWIJ
=== changed.I.txt ===
ABCDEFGHXJ
=== changed.J.txt ===
ABCDEFGHIZ

이렇게 하면 각 문자가 개별적으로 변경됩니다. 이 작업을 단계별로 수행하여 첫 번째 파일은 첫 번째 문자만 변경하고 두 번째 파일은 첫 번째와 두 번째 문자를 모두 변경하려는 경우 다음을 수행할 수 있습니다.

tmpFile=$(mktemp) 
printf '%s\n' "$string" > "$tmpFile" 
while IFS=' ' read -r from ignore to; do 
    tr "$from" "$to" < "$tmpFile" > changed."$from".txt
    cp changed."$from".txt "$tmpFile"
done < sub.txt 

그러면 다음 파일이 생성됩니다.

$ for f in changed.*; do printf '%s\n' "=== $f ==="; cat "$f"; done
=== changed.A.txt ===
YBCDEFGHIJ
=== changed.B.txt ===
YVCDEFGHIJ
=== changed.C.txt ===
YVQDEFGHIJ
=== changed.D.txt ===
YVQKEFGHIJ
=== changed.E.txt ===
YVQKLFGHIJ
=== changed.F.txt ===
YVQKLOGHIJ
=== changed.G.txt ===
YVQKLOPHIJ
=== changed.H.txt ===
YVQKLOPWIJ
=== changed.I.txt ===
YVQKLOPWXJ
=== changed.J.txt ===
YVQKLOPWXZ

답변2

sed를 사용하세요:

문자열의 두 문자를 하나씩 변경하려면,

sed -i 's/A/Y/;s/B/V/' file 

변경하고 다른 파일에 저장하려면:

sed 's/A/Y/' file > file1; sed 's/B/V/' file > file1

답변3

다음 방법으로 수행되었으며 훌륭하게 작동합니다.

    awk '{gsub("A","Y",$0);print $0}' l.txt > f_1.txt
    awk '{gsub("B","V",$0);print $0}' l.txt > f_2.txt
    awk '{gsub("C","Q",$0);print $0}' l.txt > f_3.txt

답변4

오류를 방지하기 위해 사용자 입력을 기반으로 스크립트를 만들었습니다.

    #!/bin/bash
    echo "enter the character need to display"
    read old
    echo "enter the  need character to be replaced"
    read new
    sed "s/$old/$new/g" r.txt>file_$old.txt



First it will ask for old content which need to be replaced. 
Second it will ask for new content which needs to be replaced with old content
THird it saves the file  after each iteration

Based on how  characters need to be replaced you can add above mentioned script in for loop

관련 정보