2013-08-21 8 views
13

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

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

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

答えて

11

いいえ、trは、特に、単一の文字で、単一の文字を置き換えることを意図された(または、によってコマンドラインオプションでは、文字を削除したり、1つの文字の実行を1回だけ置き換えたりできます。

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

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

(これは改行文字としてバックラッシュ-N \nシーケンスを解釈するためにsedが必要であることに注意してください「GNUのSEDは、これを行いますが、POSIXはdoesnの。 。tは、正規表現内を除いて、それを指定して、とそうでないsedの古いバージョンは間違いなくあります)

0

いいえ、申し訳ありません。

trは、ある文字を別の文字と訳したいという意味です。

は、数多くのオプションがありますが、私はすなわち、awk使用することになり

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

出力

asdlksad ~ 
adlkajsd ~ 
12345 
2

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

あなたの例で
awk -F'~' -v OFS="~\n" '$1=$1' 

テスト:

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

trのみ1本の翻訳に1を行うことができます。ここで

純粋バッシュを使ってことを行うための一つの方法です:

s='"asdlksad ~ adlkajsd ~ 12345' 
r=$'~\n' 
echo -e "${s//\~/$r}" 
asdlksad ~ 
adlkajsd ~ 
12345 
2
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n' 

sedのため、 - このは、\ nは

を交換し、問題を持つ、完璧に動作します
関連する問題