3

以下の2つの形式のいずれかになり得る構成ファイルがあるとします(短い例ですが、基本的に最初の形式は長すぎるため、行継続文字を使用する必要がありますが、2番目の形式は単に長いです行の続きのない行)

data1=x data2=y data3=z \
datakey

2番目のフォーマット

data=1 data2=y data3=z datakey

data1=x data2=y data3=x datakey両方の状況で正確な線を一致させたい。それを行う簡単な方法はありますか?

4

5 に答える 5

4

read\行継続文字として解釈されます。

while read line ; do
    if [[ $line == 'data=1 data2=y data3=z datakey' ]] ; then
        echo "$line"
    fi
done
于 2012-10-08T06:17:11.477 に答える
1

たぶん、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
于 2012-10-08T06:11:08.077 に答える
1

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ホールドスペースを印刷されるパターンスペースにコピーします)。

于 2012-10-08T07:10:43.827 に答える
0
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
> 
于 2012-10-08T06:24:23.840 に答える
0

私は上記の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

説明:

  1. re = search-stringは、検索する正規表現を設定します。
  2. ls = ls "" $ 0新しい行をls(line-search)に連結し、上記のsedの例のように元の行をlp(line-print)に格納します。
  3. / \\ $ /は、入力に継続文字があるかどうかを確認し、substr()がlsから余分な文字を削除する場合、lpには元のフォーマットを維持するために改行が追加されます。最後に、 next により、awkは次の行を読み取り、最初のルールから開始します。
  4. ls〜iはライン探索reを検索し、それがprints lpと一致する場合、必要に応じてlsを印刷するスイッチを追加できます。
  5. 最後に(最後から2番目ではありませんが)継続行がない場合はlsとlpをリセットします。
  6. ENDは特別なルールであり、ここではlsにまだ値が割り当てられていることを検出するために使用されます。つまり、継続行はEOFにあります。正規表現を検索しました。一致すると、上記で追加された追加の改行が切り捨てられます。

さて、誰も行の終わりに「\」を書くことはありませんか?

于 2015-10-09T16:15:59.763 に答える