したがって、テキストファイルには次の行があります。
CN=blabla:client:blablafile.jks, 26-Oct-2019, fabric, hostname:/path/to/jks/file/
:blablafile.jks
行末に移動する必要があります。出力は次のとおりです。
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile.jks
したがって、文字を行末に移動するときは、その:
文字も削除する必要があります。blablafile.jks
sedコマンドを使用していくつか試しましたが、日付をファイルの末尾に移動する方法のみを修正しました。しかし、必要な結果を得るにはどうすればよいかわかりません。
誰かが私を助けることができますか?
編集する:
*.jks
また、すべてのファイルを各行の最後に移動するようにこの特定のコマンドを設定できますか?
オリジナル:
CN=blabla:client:blablafile.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
CN=blabla:client:blablafile31242.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
CN=blabla:client:blablafile3222242.jks, 26-Oct-2019, server, hostname:/path/to/jks/file/
になる:
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile31242.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/, blablafile3222242.jks
答え1
使用sed
:
sed -E 's/(.*):([^,]*\.jks)(,.*)/\1\3, \2/' infile
内部のすべてをキャプチャグループといい、最初のグループ、2番目のグループ(...)
などの逆参照を使用します(最大値のみ)。\1
\2
\9
:
一致リテラルは、:
[^,]*
カンマを除くすべての文字と一致
\.jks
します.
。jks
:[^,]*\.jks,
コロンの後に.jks
カンマで終わるすべての項目と一致します。この部分を([^,]*\.jks)
最後に移動するために、(...)
コロンを削除して:
キャプチャグループの外に置きます。
外部キャプチャグループは、(.*)
キャプチャグループの上のすべての項目をキャプチャします。 1つ目は\1
「(.*)
」、2つ目は「」\2
、([^,]*\.jks)
3つ目は「\3
」(,.*)
でアクセスできます。
答え2
GNUでテストされましたawk
。
split()
最初のフィールドは配列に配置され、そのa
値$1
に再割り当てされ、その値として生成されます。a[1]
a[2]
$5
a[3]
- OFSを区切り文字として使用します。
awk -F, '{split($1,a,":",sep);$1=a[1]sep[1]a[2]; $5=a[3]; print $0}' OFS=',' file
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile31242.jks
CN=blabla:client, 26-Oct-2019, server, hostname:/path/to/jks/file/,blablafile3222242.jks