如何使用 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 文件一样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