以下の2つの形式のいずれかになり得る構成ファイルがあるとします(短い例ですが、基本的に最初の形式は長すぎるため、行継続文字を使用する必要がありますが、2番目の形式は単に長いです行の続きのない行)
data1=x data2=y data3=z \
datakey
2番目のフォーマット
data=1 data2=y data3=z datakey
data1=x data2=y data3=x datakey両方の状況で正確な線を一致させたい。それを行う簡単な方法はありますか?
read\行継続文字として解釈されます。
while read line ; do
if [[ $line == 'data=1 data2=y data3=z datakey' ]] ; then
echo "$line"
fi
done
たぶん、grepはそのような問題に最適なツールではありません。
すべての行の末尾をで結合して\から、通常どおりその出力をgrepすることができます。
ファイルがあるとします。
$> cat text
1
2
fasdfasdf
data1=x data2=y data3=z \
datakey
fasfd
sdf
したがって、次で終わるすべての行を結合できます\。
$> awk '{line = $0}; /.*\\/ {split($0,tmp,"\\"); line = tmp[1]; getline; line = line $0}; { print line }' text
1
2
fasdfasdf
data1=x data2=y data3=z datakey
fasfd
sdf
sedを使用して、末尾のない出力を作成します\。
sed -e ':begin;/\\$/{N;bbegin};s/\\\n//g' your_file
次に、それをgrepできます。
sed -e ':begin;/\\$/{N;bbegin};s/\\\n//g' your_file | grep your_pattern
これはすべてsedで行うこともできます。
sed -n -e ':begin;/\\$/{N;bbegin};s/\\\n//g;/your_pattern/p' your_file
更新:
上記を説明するには:
:beginコマンドで分岐(goto)できるタグを設定しbます。/\\$/{N;bbegin}\現在の行が( )で終わっている場合は/\\$/、次の行をバッファ(N)に追加し、開始()に進みますbbegin。\すべての\と改行(thes / \\ n // g`)を削除します。-nオプションは、スクリプトの最後に行を出力するようにsednoに指示します。/your_pattern/p一致する場合は行を出力しyour_patternます。UPDATE2:
さらに良い方法で、ファイルの元の行を表示することもできます。
sed -n -e ':begin;/\\$/{N;bbegin};h;s/\\\n//g;/your_pattern/{g;p}' your_file
これは、 \と改行を削除する前に、データをホールドスペース(h)に保存し、行が一致する場合は、保存されたデータを印刷します(gホールドスペースを印刷されるパターンスペースにコピーします)。
awk -v i="data1=x data2=y data3=z datakey" '{x=x" "$0}END{y=match(x," "i);if(y) print "yes its a match"}' temp
以下でテスト済み:
> cat temp
data1=x data2=y data3=z
datakey
> awk -v i="data1=x data2=y data3=z datakey" '{x=x" "$0}END{y=match(x," "i);if(y) print "yes its a match"}' temp
yes its a match
>
私は上記のsedの例が好きで、すでに提出されているawkの例には気づきませんでした。これは、フォーマットを保持し、複数の継続行とファイルの終わりを処理するawk(nawk)バージョンです。
nawk -v re="search-string" \
'{ls=ls""$0;lp=lp""$0}
/\\$/{ls=substr(ls,1,length(ls)-1);lp=lp"\n";next}
ls~re{print lp}
{lp=ls=""}
END{if (ls ~ re)print substr(lp,1,length(lp)-1)}' input-file
説明:
さて、誰も行の終わりに「\」を書くことはありませんか?