
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
)를 string 으로 설정한 ":"
다음 이를 "
첫 번째 :
구분 기호 필드 앞에 추가하고 마지막 필드에 추가합니다. 그런 다음 결과 레코드를 인쇄합니다.
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