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を印刷します。OFS
arr
$(i-3)=arr[i]
$1
$1
$(4-3)
$1
awk
$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