次のファイルがあります。
AAAA
BBBB
CCCC
DDDD
etc
単語は別の行にあります。引用符を使用して追加したいですtr
。
だから、次のことを試しました。
1)各単語の先頭に引用符を追加します。'AAAA
tr '^\w$' '\'\w$' <file.txt
動作しませんtr '^\w$' ''\w$' <file.txt
動作しません
上記の両方の状況は、コマンドラインがハングする原因になります。
2)最後に引用符を追加するために、次のことを試しました。
tr '\n' ''\n' <file.txt
ただし、これは機能せず、コマンドラインが中断されます。
なぜこれらの正規表現がで動作しないのですかtr
?
答え1
このうち複数を交換することはできませんtr
。私はsed
代わりにこれを行います。
はい
$ sed "s/^/'/" file.txt
'AAAA
'BBBB
'CCCC
'DDDD
各行の先頭(^
)を見つけて一重引用符()に置き換えることを意味します'
。
「word」を一重引用符で囲むには、次の形式のコマンドを使用できます。
$ sed "s/\(.*\)/'\1'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'
今回は、その行のすべての内容を一時変数(\1
)に保存します。次に、その行をthisに置き換えます'\1'
。
このコマンドは次のように省略できます。 GNU固有のスイッチの使用:
$ sed -r "s/^(.*)$/'&'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'
答え2
tr
音訳用です。広く使用されている使用法の1つtr
は、文字列の大文字と小文字を変更することです。
$ echo 'this is a test' | tr a-z A-Z
THIS IS A TEST
一部のオペレーティングシステムのバージョンには次の形式がtr
必要であり、この場合も引用する必要があります。a-z
[a-z]
$ echo 'this is a test' | tr '[a-z]' '[A-Z]'
THIS IS A TEST
システムにインストールされたパッケージに関する情報を表示するには、info
tr ページに非常に良い例とtr
コマンドの追加の説明があります。
info coreutils 'tr invocation'
達成したい目標には、sed、Perl、または awk を使用できます。
真珠:
perl -pe "s/^/'/" file
各行に対して行の先頭(^
)と一致し、次に置き換えられます。'
Seder:
sed "s/^/'/" file
Perlに似た例
奇妙な:
awk -v x="'" '{ print x$0 }' foo
変数xを次のように指定'
し、各行に対して印刷してから、行'
全体を印刷します。
答え3
いいえ、tr
文字を1つずつ置き換える場合にのみ該当します。この方法では文字を追加できません。
Perlのようなものを使ってこれを行うことができます。
perl -pe "s/\w+/'$&'/"
たとえば、tr
ある参照を別の参照にのみ置き換えることができます。
tr \" \'
これらのバックスラッシュは、文字自体を解釈するのではなく、文字をそのまま送信するようにシェルに指示します。
以下は機能しません:
tr '"' '''
tr '"' '\''
最初のパラメータ('"'
)は大丈夫です。まったく同じです\"
。どちらの場合も、2番目の引数は機能しません。 2番目の引用符は引用符を終了し、3番目の引数は欠落している新しい引用符を開くため、単一引用符で一重引用符を使用することはできません。 (したがって、シェルは足りない閉じた引用符を待つために新しい行を開きます。)
しかし、これはすべて空の殻であり、私たちとは何の関係もありませんtr
。
答え4
最速の解決策は、通常、最も簡単な単一の作業ユーティリティを使用することです。
tr
は単純なユーティリティですが、音訳(与えられた文字を別の文字に変換)、指定された文字の削除、または文字圧縮など、他の目的にも使用できます。
sed
、awk
またはperl
(サイズ順)などのより一般的なユーティリティはこれを行うことができますが、これには優れた作業を行う単一のタスクユーティリティがありますpaste
。
paste -d\' /dev/null file.txt /dev/null
または:
:|paste -d\' - file.txt -