trは正規表現で使用できますか?

trは正規表現で使用できますか?

次のファイルがあります。

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 

システムにインストールされたパッケージに関する情報を表示するには、infotr ページに非常に良い例と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は単純なユーティリティですが、音訳(与えられた文字を別の文字に変換)、指定された文字の削除、または文字圧縮など、他の目的にも使用できます。

sedawkまたはperl(サイズ順)などのより一般的なユーティリティはこれを行うことができますが、これには優れた作業を行う単一のタスクユーティリティがありますpaste

paste -d\' /dev/null file.txt /dev/null

または:

:|paste -d\' - file.txt -

関連情報