パスワードファイルに二重引用符を追加する方法

パスワードファイルに二重引用符を追加する方法

sedまたは他のユーティリティを使用してpasswdファイルに二重引用符を追加するには:

ソースファイル:

user1:x:1:1:User1:/home/user1:/bin/bash
user2:x:2:2:User2:/home/user2:/bin/bash
user3:x:3:3:User3:/home/user3:/bin/bash

私がしたいこと:

"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"

答え1

あなたはできます:

sed 's/[^:]*/"&"/g' /etc/passwd

つまり、*:[^:]以外のゼロ個以上の()文字シーケンスを引用符で囲みます。

または、二重引用符文字を含むフィールドを正しく引用し(csvスタイル)、ここにヘッダーを追加する専用のcsv処理ツールを使用してください。

mlr --icsvlite --ocsv --implicit-csv-header --fs : --quote-all label \
  'User Name,Password,UID,GID,Gecos,Home Directory,Shell' /etc/passwd

答え2

私は次の方法でそれをしました

注文する:

sed 's/:/"&"/g' filename | sed 's/^/"/'| sed 's/$/"/'

または、

sed 's/:/"&"/g; s/^/"/; s/$/"/' filename

出力:

"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"

答え3

使用してくださいawk(ソリューションほど短くはありませんがsed):

$ awk -F ':' -v OFS='":"' '{ $1 = "\"" $1; $NF = $NF "\""; print }' file
"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"

これは、出力フィールド区切り文字(OFS)を文字列に設定し、":"それを"最初の:区切り文字フィールドの前に追加し、最後のフィールドに追加します。次に、結果レコードを印刷します。


awk繰り返しますが、フィールドを繰り返しながら変更されたレコードを出力する前に、各フィールドに二重引用符を追加します。

awk -F ':' -v OFS=':' '{ for (i=1; i<=NF; ++i) $i=sprintf("\"%s\"", $i); print }' file

:from を使用すると、あたかも区切りの CSV ファイルであるかのようにファイルを読み取ることができます。csvformatcsvkit:

$ csvformat -d ':' -D ':' -U 1 file
"user1":"x":"1":"1":"User1":"/home/user1":"/bin/bash"
"user2":"x":"2":"2":"User2":"/home/user2":"/bin/bash"
"user3":"x":"3":"3":"User3":"/home/user3":"/bin/bash"

csvformatここでは、入力フィールドと出力フィールドの区切り文字が何であるかを伝え:、実際に必要かどうかにかかわらず、すべてのフィールドを引用符で囲みたいと思います。

答え4

ただ楽しいです、ルビー:

ruby -rcsv -e '
    csv_in  = CSV.new File.new ARGV.shift, col_sep: ":"
    csv_out = CSV.new $stdout,             col_sep: ":", force_quotes: true
    csv_in.each {|row| csv_out << row}
' /etc/passwd

関連情報