如何在密码文件中添加双引号

如何在密码文件中添加双引号

如何使用 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

即用引号将*:( [^:]) 之外的 0 个或更多 ( ) 字符的任何序列括起来。

或者使用专用的 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读取文件,就好像它是一个:-delimited 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

相关内容