문자열의 모든 문자를 교체 규칙에 따라 하나씩 변경하고 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