コマンドラインでは実行できますが、シェルスクリプトでは実行できません。

コマンドラインでは実行できますが、シェルスクリプトでは実行できません。

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

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}。コマンドラインで動作している場合は、エイリアスがまたはgrepgrep -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ただし、フィールドで区切られたデータを処理するように設計されています。おそらくあなたの人生をはるかに単純にするでしょう。

おすすめ記事