web-dev-qa-db-ja.com

trで特定の文字列を削除します

UNIXシェルでtrコマンドを使用して特定の文字列を削除することはできますか?例:入力した場合:

tr -d "1."

入力は1.1231、それは23を出力として使用しますが、1231(最初の1 行っている)。どうすればいいですか?

あなたが解決策またはより良い方法を知っているなら、私はただコピー&ペーストするだけでなく、学びたいので、構文を説明してください。

Awkには大きな問題があるので、これを使用する場合はさらに説明してください。

18
intelinside

上記の例では、cutコマンドで十分です。

例:echo '1.1231' | cut -d '.' -f 21231を返します。

cutの詳細については、man cutと入力してください。

8
Kevin Sjöberg

ある種の正規表現(sedのようなもの)を使用した方が良いでしょう。

たとえば、入力1.1231では、次を使用して1231出力を取得できます。

sed 's/1\.//g'

ここをご覧ください: http://tldp.org/LDP/abs/html/string-manipulation.html

11
tajhamille

この種のものにはsedも使用できます。

$ echo "1.1231" | sed -e "s/1\.//"
1231

これは、sedを使用して正規表現の検索と置換を実行し、「1」を置換するだけです。 (適切にエスケープして)「」で。デフォルトでは最初の一致のみを削除します。

5
Asumu Takikawa

bashを使用している場合、 parameter substitution を使用すると簡単にこれを実行できます。

$ a=1.1231
$ echo ${a#1.}
1231

これにより、leading"1."文字列が削除されます。 firstオカレンスまで削除する場合は、${a#*1.}を使用し、last発生、${##*1.}を使用します。

文字列操作 のTLDPページには、追加のオプション(部分文字列抽出など)があります。

このような単純な変換に標準のsh組み込み文字列操作ツールを使用すると、sedawkcutは、シェルが操作を実行するためにサブプロセスを作成する必要がないためです。ただし、より複雑な場合(たとえば、正規表現を使用する必要がある場合や、入力が大きい場合)は、専用ツールを使用することをお勧めします。

4
Michael Wild

awkについて具体的に尋ねたので、ここにもう1つあります。

awk '{ gsub(/1\./,"") }1' input.txt

awkチュートリアルでわかるように、awkプログラムの一般的な形式は、一連の「条件{アクション}」です。アクションがない場合、デフォルトのアクションは印刷です。条件がない場合、アクションは無条件に実行されます。このプログラムは、これらの特別な場合の両方を使用します。

最初の部分は条件なしのアクションです。つまり、すべての行に対して実行されます。アクションは、正規表現/1\./のすべての出現を何も置き換えないことです。これにより、「1」がトリムされます。 (コンテキストに関係なく)行から。

2番目の部分はアクションのない条件です。つまり、条件がtrueの場合に出力され、条件は常にtrueです。これは、「完了です。今あるものは何でも印刷する」という一般的なイディオムです。これは、単に1定数で構成されます(条件として使用される場合、単に「true」を意味します)。

これはいくつかの方法で再定式化できます。たとえば、最初のアクションに印刷を含めることができます。

awk '{ gsub(/1\./,""); print }'  input.txt

おそらく、整数部分、つまりピリオド記号の前の任意の数字に置き換えたいと思うでしょう。そのための正規表現は/[0-9]+\./のようなものになります。

gsubはGNU拡張なので、従来のsub構文への移植性が必要な場合は、awkまたは何らかのループに置き換えることができます。

2
tripleee