비밀번호 파일에 큰따옴표를 추가하는 방법

비밀번호 파일에 큰따옴표를 추가하는 방법

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 파일 인 것처럼 파일을 읽을 수 있습니다.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

관련 정보