web-dev-qa-db-ja.com

trを使用して1文字を2文字に置き換える方法

Trは1文字を2文字に置き換えることができますか?

「〜」を「〜\ n」に置き換えようとしていますが、出力で改行が生成されません。

$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
23
Paolo

いいえ、trは、特に、単一の文字を単一の文字に置き換えることを目的としています(または、コマンドラインオプションに応じて、文字を削除したり、単一の文字の実行を1回だけ置換したりします)。

sedは、おそらくこの特定のジョブに最適なツールです。

$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
 adlkajsd ~
 12345

(これには、バックスラッシュn \nシーケンスを改行文字として解釈するためにsedが必要であることに注意してください。GNU sedはこれを行いますが、 [〜#〜] posix [〜 #〜] は正規表現内を除いて指定しません。また、指定しないsedの古いバージョンは間違いなくあります。

25
Keith Thompson

あなたはawkで行くことができます、FS/OFS変数があなたのために仕事をするようにしてください:

awk -F'~' -v OFS="~\n" '$1=$1' 

あなたの例でテストしてください:

kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345" 
asdlksad ~
 adlkajsd ~
 12345
3
Kent

trは1対1の変換のみを実行できます。

これを行う1つの方法を次に示します純粋なBashを使用:

s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
 adlkajsd ~
 12345
1
anubhava

できません、ごめんなさい。

trは、ある文字を別の文字に音訳することを意味します。

多数のオプションがありますが、awkを使用します。

echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'

出力

asdlksad ~
 adlkajsd ~
 12345
1
shellter
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

--sedは\ nの置換に問題があるため、これは完璧に機能します。

0
Samanway