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 ファイルであるかのようにファイルを読み取ることができます。csvformat
csvkit:
$ 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