n番目の区切り文字の後のすべての項目を印刷します。

n番目の区切り文字の後のすべての項目を印刷します。

n番目の区切り文字の後に残りの文字列(区切り文字のない列だけでなく)をどのように印刷しますか?

次のような一連のレジストリキーを含むテキストファイルがあります。

hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary

3文字目\以降のすべての内容を印刷したいです。だから私は出力を探しています。

software\microsoft\windows\currentversion\runonce\delete cached update binary

特定の列印刷を使用する方法を知っていますが、区切り文字を使用して列を印刷するのではなく、指定された区切り文字を使用して文字列を分割するawk簡単な方法はありますか?bash

答え1

パイプが通過します cut -d \\ -f 4-

echo 'hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary' | cut -d \\ -f 4-

生産する:

software\microsoft\windows\currentversion\runonce\delete cached update binary

\\単一は\エスケープ文字なので、二重に注意してください。

答え2

そしてsed

sed -E 's/^([^\]*[\]){3}//' infile

または同じawk

awk '{ sub(/([^\\]*[\\]){3}/, "") }1' infile

(regex)3回繰り返される一致項目です[^\]*[\]。バックスラッシュ文字の後にあるバックスラッシュ(例外の改行文字を除く)を除くすべての文字のうち0個以上と一致します。


およびシェル(POSIX sh/bash/Korn/zsh)ソリューション:

$ str='hku\test\user\software\microsoft\windows\currentversion\runonce\delete cached update binary'
$ for i in $(seq 3); do str="${str#*\\}"; done
$ printf '%s\n' "$str"

構文は次のとおり${parameter#word}です。パラメータ拡張、引数から最短の接頭辞を削除します。

答え3

使用awk:

awk 'BEGIN{FS=OFS="\\"; }{for(i=4;i<NF;i++) printf "%s", $i OFS; print $NF }' input

3文字\目以降のすべての内容を印刷したいので、フィールド区切り文字FSと出力フィールド区切り文字OFSはに設定されます\FS="\\"シングルは\エスケープ文字だからです。これはアーカイブ区切り文字であるため、\forループを使用してアーカイブ番号4からレコードの最後のフィールドまで印刷します。

または次のようになります。

awk 'BEGIN{FS=OFS="\\"; }{for(i=4;i<=NF;i++) printf "%s", $i (i==NF?ORS:OFS) }' input

ここではすべてが同じですが、三項演算子が使用されます。ここで、forループは最後のフィールドを除くすべてのフィールドの後に印刷されますOFS。これにより、$i最後のフィールドの後にORS改行文字が印刷されます。

別の方法:

awk 'BEGIN{OFS="\\"} { n=split($0,arr,OFS); $0=""; for (i=4; i<=n; ++i) $(i-3)=arr[i]; print }' input

ここに組み込まれた関数は配列をsplit()分割し$0て生成します。その後、forループはレコードの各フィールドをに変更します。たとえば、forループの最初の要素の場合はarr [4]になります。 .ループが完了すると、新しいレコードは前のレコードの4番目のフィールド()から始まります。その後、printコマンドはnewを印刷します。OFSarr$(i-3)=arr[i]$1$1$(4-3)$1awk$0$0$0

答え4

お見逃しなくperl

perl -e '@a=split /\\/, $ARGV[0]; print(join("\\", splice @a, 3), "\n")' $str

str道はどこにありますか?

または末尾の改行なしで:

perl -e '@a=split /\\/, $ARGV[0]; print join "\\", splice @a, 3' $str

関連情報