投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2015年4月16日木曜日

【Linux CentOS 6 bash】 変数の前方後方パターンマッチによる部分消去方法、複数行ファイルのforループによる処理方法について【シェルスクリプト】

変数に保存された文字列を切り取る方法
forループが項目として認識するための区切りを改行コードのみにする方法


(処理でつかうデータ)
次のような行が、20150416.txt に保存されているとする。
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
20150416_1216_-xxx-yyy-dat000002971
20150416_1321_--anonymous-dat000002990
20150416_1431_--anonymous-dat000003011
各行のdat以下の文字列は、拡張子(tif)を除いたファイル名である。


(処理内容)
この記録をつかって、ファイルを検索し別ディレクトリにコピーする。
ただし、ファイル名を一部変更する。

たとえば、
cp dat000002954 /home/test/20150416/20150416_1140.dat
と処理されるようにする。


(処理方法)
次のスクリプトを作成し処理を行った。

#!/bin/bash
IFS_orginal=$IFS
IFS=$'\n'

for k in `cat 20150416.txt`
do
cp ${k##*-}.dat /home/test/20150416/${k%_*}.dat
done

IFS=$IFS_orginal


<解説>
`cat 20150416.txt`でファイルから行を先行して取得する。
取得した複数行に対して、for 変数 in をあてがって、1行ずつ取得する。
毎行の処理は、do~done で行う。 (cpコマンドを実行している。)

ところで、このように、for 変数 in によって、1行ずつ取得するために、
項の区切り文字の設定を、IFS=$'\n' として改行コードにした。
(さもなければ、行中にスペースが存在している場合にその前後で分断されて変数に格納されてしまう。)

この各行処理では、変数kによって行内容を取得している。
処理条件のとおり、各行の最後にあるdat以下の文字列を必要としている。
次のような行の場合、
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
変数kから不要な文字列を切り取ったものを使用すればよい。


○前方一致でパターンにマッチした部位を排除する方法
行の最後に現れる「 - 」以前の文字列を除外するためには、次のようにする。
${k##*-}
前方一致系は「#」記号を用いる。文字列の前方から指定パターンを探してそのマッチ部位を除外する。
この例では、dat000002954 を取り出したい。
そのため、行の前方から見て一番最後に現れる「 - 」を探したいので、「##」を用いる。
「*」ワイルドカードを置くことで、この「 - 」以前の文字列がマッチし、それらが排除される。


○後方一致でパターンにマッチした部位を排除
${k%_*}
後方一致系は「%」記号を用いる。文字列の後方から指定パターンを探してそのマッチ部位を除外する。
この例では、20150416_1140 を取り出したい。
そのため、行の後方から見て一番最初に現れる「 _ 」を探したいので、「%」を用いる。
「*」ワイルドカードを置くことで、この「 _ 」までの文字列がマッチし、それらが排除される。



<参考>
・shとbashでの変数内の文字列置換などAdd Star
 < http://d.hatena.ne.jp/ozuma/20130928/1380380390 >
2015年04月16日

・IFSを変更して区切り文字を改行だけにする
 < http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%E3%82%921%E8%A1%8C%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html#y44021bd >
2015年04月16日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad