Bashを使用してファイルの各行からデフォルト名を取得する方法

Bashを使用してファイルの各行からデフォルト名を取得する方法

次の行を含むファイルがあります。

ファイル1

./filled/Event_repeatFILLED.svelte
./dir2/Miscellaneous_servicesFILLED.svelte
./outline/Line_weightFILLED.svelte
./two-tone/ArchitectureFILLED.svelte
...many more lines ...

基本名だけを含むファイルを作成したいと思います。

ファイル2

Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...

現在、以下は機能しません。

sed 's/^.\///' file1 > file2

Shell / Bashを使用してこれを行うにはどうすればよいですか?

ベストアンサー1

sed 代替コマンドでは、異なる区切り文字を使用する必要があります。たとえば、

$ sed 's|.*/||' file 
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...many more lines ...

または:

$ perl -pe 's|.*/||' file 
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...many more lines ...

または以下を使用してawk

$ awk -F'/' '{print $NF}' file 
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...many more lines ...

それとも、次のような愚かなことがあります。

$ rev file | cut -d / -f 1 | rev
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...many more lines ...

あるいは、コメントに提案されているように使用することもできますが、basenameこれはより複雑で遅くなります。

$ while IFS= read -r fileName; do basename -- "$fileName"; done < file
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte

最後に、本当に純粋なシェルソリューションが必要な場合は、次のようにすることができます。

$ while IFS= read -r fileName; do printf '%s\n' "${fileName##*/}"; done < file
Event_repeatFILLED.svelte
Miscellaneous_servicesFILLED.svelte
Line_weightFILLED.svelte
ArchitectureFILLED.svelte
...many more lines ...

ただし、最後の2つは使用しないでください。効率が最も低く複雑です。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?

おすすめ記事