正規表現を改善するために映画データベースの問題を研究していますが、これが私が経験している問題です。私のデータセットは次のとおりです。
映画名(可変スペースとタブ)の年
映画1(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>初年度
映画2(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>第二年
映画3(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>3年目
映画4(それらの間にスペースがある場合もあれば、複数のスペースがある場合もあります)(可変スペースとタブは\ t +または複数のスペースまたは単一のスペースにすることができます。>4年生
すべての映画の名前を抽出したいです。私がこのことをしながら経験した困難は次のとおりです。
1: 区切り記号は可変です。コロンまたはユニークな場合は、awkコマンドを使用して次のように抽出します。awk -F 'separator' '{print $1}'
この場合、単一のスペース、複数のスペース、または\ tの組み合わせにすることができます。または空白。2:区切り文字が\ tの行の場合、映画名には含まれていないため、\ tを使用して抽出できます。ところで、区切り文字が空白1つか空白2つであればどうなりますか?映画のタイトルに簡単に表示できます。このような状況では、どうすればいいかわかりません。
私はこの質問が非常に厳格で具体的であることを知っています。しかし、前述したように、ここではかなり困惑しています。この問題を解決する方法は思い出されません。
目標を達成するために使用できるgrep / sed / awkとreg-exの組み合わせはありますか?
答え1
gawk
年が常にレコードで終わると仮定して使用してください。
awk -F"[0-9]{4}$" '{print $1}' movies
答え2
大きな打撃:
while read -r line; do
if [[ $line =~ (.*)[[:blank:]]+[0-9]{4}$ ]]; then
echo "${BASH_REMATCH[1]}"
fi
done < data
sed:
sed 's/[[:blank:]]\+[0-9]\{4\}$//' < data
答え3
本当に簡単です。最後のフィールド(年)にスペースが含まれていない限り(あなたの質問では明確ではありませんが、これが真であると仮定します)、最後のフィールドを削除するだけです。たとえば、
$ cat movies
Casablanca 1942
Eternal Sunshine of the Spotless Mind 2004
He Died with a Felafel in His Hand 2001
The Blues Brothers 1980
したがって、ヘッダーのみを印刷するには、次のものを使用できます。
$ perl -lpe 's/[^\s]+$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
$ sed 's/[^ \t]*$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
またはヘッダーのスペースも縮小します。
$ sed -r 's/[\t ]+/ /g;s/[^ \t]*$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
$ perl -lpe 's/\s+/ /g;s/[^\s]+$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
$ awk '{for(i=1;i<NF-1;i++){printf "%s ",$i} print $(NF-1)}' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
年が常に4桁の場合は、次のものを使用できます。
$ perl -lpe 's/....$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
または
$ perl -lpe 's/\s+/ /g;s/....$//' movies
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
または
$ while read line; do echo ${line%%????}; done < movies|od -c
Casablanca
Eternal Sunshine of the Spotless Mind
He Died with a Felafel in His Hand
The Blues Brothers
答え4
これにより、最後の数字とその前のタブとスペースが削除されます。
sed -e 's#[\t ]*[0-9]*$##' movies.txt