2016-10-09 2 views
0

に異なる動作を「カット」:「AWK」と私は単一引用符で始まる以下の文字列をカットしようとしているbashスクリプト

name1=O'Reilly 

ので、葉:

簡単です
name2=Reilly 

echo $name | cut -d\' -f 
echo $name | awk -F\' '{print $2}' 

ただし、これらのコマンドをスクリプトから実行すると、文字列は未定義のままです赤。私は区切り記号として単一引用符を使用することに問題を探してきましたが、何も見つかりませんでした。この問題を解決する方法はありますか?

+1

あなたが見るエラーとは何ですか?名前、名前1または名前2? – Smithson

+1

$ name!= $ name1 – Cyrus

+0

申し訳ありませんが、私の説明は混乱につながった。コマンド自体に問題はありません。コマンドラインでコマンドを実行すると、目的の結果が得られます。それらは再び命令です。 name = O'Reilly echo name | cut -d \ '-f echo $ name | awk -F \ "'{print $ 2}' どちらの場合も、出力は「Reilly」です。これは必要なものです。問題は、これをbashスクリプトから実行すると、出力はO'Reillyになります。私は何か間違っているのですか? – Cvg

答えて

2

変数が展開する文字列は変更されず、文字列操作の結果が出力されます。

あなたは、変数nameのための新しい参照を作成し、変数nameとしてcut/awk操作の結果を保存するためにコマンド置換を使用する場合:あなたが宣言したい場合は、一方

% name="O'Reilly"       

% echo "$name" | awk -F\' '{print $2}'   
Reilly 

% name=$(echo "$name" | awk -F\' '{print $2}') 

% echo "$name"        
Reilly 

入力として一方(name1)、及び異なる変数として出力を保存(name2):

% name1="O'Reilly"       

% name2=$(echo "$name1" | awk -F\' '{print $2}') 

% echo "$name2"        
Reilly 

しかしこれはパラメータ展開を使用して取得する方が簡単かもしれません:

$ name="O'Reilly" 

$ echo "${name#*\'}" 
Reilly 

$ name="${name#*\'}" 

$ echo "$name" 
Reilly 
関連する問題