10

テキストファイルのいくつかの異なる文字列にある番号を置き換えようとしています。基本的にそれは次の形をとります

tableNameNUMBER
carNUMBER

私はbashとスクリプティングにかなり慣れていないので、NUMBER渡したものに置き換える方法がわかりませんでした。そこで、これを試しました。

#! /usr/bin/env bash
sed "s/NUMBER/$1/" myScript.txt > test.txt

次に、コマンドラインで:

sh test.sh 123456

これNUMBERは、が単独である場合にのみ機能し、その前にある場合はありtableNameませcarん。そのような場合、どうすれば交換できますかNUMBER。持っている方がいい${NUMBER}ですか?これらが完全に初心者の質問である場合は申し訳ありません。

4

3 に答える 3

10

これは問題なく機能するはずです。

sed "s/NUMBER/$1/g" myScript.txt > test.txt

最後に、g1行に複数回表示される場合、セットでNUMBERを置き換えることができます。

実際、簡単なテスト:

foo.txt

carNUMBER
tableNameNUMBER
NUMBER
NUMBERfoo

$ NUMBER=3.14
$ sed "s/NUMBER/$NUMBER/g" foo.txt
car3.14
tableNumber3.14
3.14
3.14foo

それはあなたのsed命令がしていることではありませんか?

NUMBERを単独で変更しない限り変更しないようにする場合は、次を使用\bNUMBERます。

$ sed "s/\bNUMBER\b/$NUMBER/g" foo.txt
carNumber
tabelNumberNUMBER
3.14
NUMBERfoo

文字列の大文字と小文字を気にしない場合は、sedコマンドの最後にをNUMBER置きます。i

$ sed "s/NUMBER/$NUMBER/gi" foo.txt
于 2012-10-04T21:48:34.813 に答える
3

あなたはこれに不慣れであるとあなたが言ったので、私はあなたが尋ねていないいくつかの問題に最初に答えるつもりです。

あなたのシバンは間違っています

スクリプトの最初のバイトは#!(ハッシュと感嘆符。シバンと呼ばれます)である必要があります。あなたは#1(ハッシュワン)を持っています、それはぎこちないです。このシバン行は、bash実行時にファイル(つまりスクリプト)の解釈に使用するようにシステムに指示します。(多かれ少なかれ。技術的に言えば、それは実際にに与えられ、それはそれを渡す前envに見つけます。)bash

シバンを修正したら、スクリプトにアクセス許可を設定して、実行可能であることをシステムに通知します。

$ chmod a+x test.sh

次に、次のように実行します。

$ ./test.sh 123456

@gokcehanもコメントしてsh ...いるように、シバンがあるときにスクリプトを実行することは冗長であり、他の理由から好ましくありません。


あなたが求めていたものに関しては、あなたはあなたの正規表現の置き換えを簡単にテストすることができます:

$ echo tableNameNUMBER | sed "s/NUMBER/123456/"
tableName123456

そして、それはうまく機能しているようです。

注:上記$は、コンソールに入力したことを示しているだけであり、実際のコマンドの一部ではありません。

于 2012-10-05T01:13:43.317 に答える
1

1111を2222に置き換えるには、おそらく試してみてください

cat textfile.txt | sed -e 's/1111/2222/g'

また

cat textfile.txt | sed -e 's/1111/2222/g' > output.txt

また

NUMBER=1111 ; NEWNUMBER=2222; cat textfile.txt | sed -e "s/$NUMBER/$NEWNUMBER/g"

このような些細な作業のために別のスクリプトを作成する必要はありません。sedの「-e」スイッチ、引用符で囲まれたコマンドの最後に追加された「g」、および一重引用符と二重引用符の違いに注意してください。

于 2012-10-04T21:12:08.503 に答える