文字列の文字を1つずつ変更するには?

文字列の文字を1つずつ変更するには?

文字列のすべての文字を置換規則に従って1つずつ変更し、Linuxでファイルに保存したいと思います。

代替ファイル(sub.txt)。

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

入力ファイル:

ABCDEFGHIJ

まず(A〜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

シェルループで繰り返して、各行の3つの要素を変数として読み取ることができます。

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

これにより、各文字が個別に変更されます。これを段階的に実行することで、最初のファイルは最初の文字のみを変更し、2番目のファイルは最初の文字と2番目の文字の両方を変更したい場合は次のことができます。

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を使用してください:

文字列の2文字を1つずつ変更するには、

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

関連情報