次の形式のファイルがあります。
436541,000454056,Smith,john,jsmith,[email protected]
「jsmith」を抽出して別のファイル「test.txt」に書きたいです。
だから私は以下を使います:
grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt
コマンドラインでは正常に動作します。
シェルスクリプトで使用すると、test.txtファイルは空です。
#!/bin/bash
grep -o '\,[a-z][a-z0-9]{1,7}' source.txt > test.txt
どんな提案がありますか?
ベストアンサー1
デフォルトでは、grep
以下を使用します。基本正規表現(BRE)サポートされていません{N}
。コマンドラインで動作している場合は、エイリアスがまたはgrep
にgrep -E
設定されている可能性がありますgrep -P
。以下を実行して確認できます。
alias | grep grep
スクリプトではエイリアスは有効になりません。説明したようにman bash
:
Aliases are not expanded when the shell is not interactive, unless the
expand_aliases shell option is set using shopt.
したがって、非対話型シェル(スクリプトの実行時に取得されるシェル)では、エイリアスは機能しません。スクリプトでエイリアスを明示的に有効にし、ファイルをインポートしてエイリアス定義をインポートする2つのオプションがあります(~/.bashrc
エスケープする必要はありません、btw)。,
#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
grep -o ',[a-z][a-z0-9]{1,7}' source.txt > test.txt
または、単純にgrep -E
スクリプト自体で次のように使用します。
#!/bin/bash
grep -Eo ',[a-z][a-z0-9]{1,7}' source.txt > test.txt
また、考慮することができますこのようなツールawk
ただし、フィールドで区切られたデータを処理するように設計されています。おそらくあなたの人生をはるかに単純にするでしょう。