API를 사용하는 새 애플리케이션으로 마이그레이션하려면 비밀번호 데이터베이스(Keepass)의 csv 파일을 사용해야 합니다. API는 JSON 데이터 형식이 필요한 게시 요청을 통해 업데이트됩니다. 내가 해야 할 일은 KeePass CSV를 사용하여 API에 연결된 비밀번호 및 기타 정보를 내보내는 것입니다. 나는 bash와 awk를 사용하여 스크립트를 작성하기로 결정했습니다.
csv 파일의 열은 다음과 같이 배열됩니다.
"Group","Title","Username","Password","URL","Notes","TOTP","Icon","Last Modified","Created"
일부 주석에는 줄 바꿈이 있기 때문에 "설명" 필드는 여러 줄입니다.
"That's an important note, <br/>
some extra infos <br/>
concerning a password"
다음은 데이터 게시를 위한 API 요청의 예입니다. 데이터 필드는 JSON 형식입니다.
이 요청에 필수 필드를 모두 추가하지는 않았지만 이미 작동 방식을 확인하실 수 있습니다. KeePass와 API 필드 이름이 다르게 만들어지기 때문에 일부 필드 이름이 다릅니다.
var1=name
var2=my.name
var3=password456
curl -s --request PUT -u username123:password123 -H 'Content-Type: application/json; charset=utf-8' https://tpm.mydomain.com/index.php/api/v5/passwords/1659.json --data-binary @- <<DATA
{
"name": "$var1",
"username": "$var2",
"password": "$var3"
}
DATA
내 CSV 파일 필드를 필드별로 구문 분석한 다음 행 구문 분석을 완료하면 데이터베이스에 비밀번호를 게시하도록 API 요청을 할 계획입니다. 그런 다음 남은 각 행에 대해 이 작업을 수행합니다.
CSV를 처리하기 위해 제 경우에는 매우 편리하고 유용해 보이는 AWK 언어를 찾았습니다. gsub 명령을 사용하여 내 파일을 여러 번 테스트했는데, 이는 개행 문자(\n)를 바꾸는 데 도움이 되었습니다. 어떻게 더 진행해야 할지 모르겠습니다. 다음은 그 중 일부입니다(첫 번째 항목만 작동합니다:
cat keepass.csv | awk NF=NF RS=/\n/ OFS=\n
cat keepass.csv |awk 'BEGIN {RS=","}{gsub("/\n/","",$0); print $0}'
cat keepass.csv | awk 'BEGIN {RS=""}{gsub(/\n/,"",$6); print $0}'
또한 awk 뒤에 -v를 추가하여 bash var를 공유할 수 있다는 것도 알고 있습니다. 이것은 내가 얻을 수 있는 가장 가까운 코드입니다.
awk -v RS='"\n' -v FPAT='"[^"]*"|[^,]*' '{
print "Row n°", NR, ""
for (i=1; i<=NF; i++) {
sub(/^"/, "", $i)
printf "Field %d, value=[%s]\n", i, $i
}} keepass.csv
내가 찾고 있는 것은 여러 줄 주석을 고려하여 csv의 모든 열을 구문 분석하고 이를 JSON 형식으로 bash의 전역 변수에 입력하는 명령입니다.
다음을 수행하여 빌드해야 한다고 생각합니다.
awk -v 'BEGIN{parsing and replacing keeping '\n' of notes}
if end of row,
return boolean to bash for processing the API requests, wait,
restart the loop}''
저는 스크립팅이 처음이고 몇 줄만 있으면 완료할 수 있다고 생각하지만 어떻게 진행해야 할지 잘 모르겠습니다. 필요한 경우 언어를 Python으로 변경할 수 있으며 코드에 몇 가지 도구를 추가할 수 있습니다.
답변1
여러 행은 CSV 셀의 기능이며 CSV 인식 유틸리티를 사용할 수 있습니다.밀러.
예를 들어 다음과 같은 경우이 CSV 파일넌 달릴 수 있어
mlr --csv cut -f fieldA acr.csv
첫 번째 열 잘라내기mlr --icsv --ojson cut -f fieldA acr.csv
첫 번째 열을 잘라내어 모두 다음으로 변환합니다.JSON
[
{
"fieldA": "That's an important note,\nsome extra infos\nConcerning a password\nIpsum"
},
{
"fieldA": "hello"
}
]
보시다시피 Miller는 셀 캐리지 리턴 문자(RFC4180준수).
아래는 샘플 입력 파일의 이미지입니다.
답변2
"설명" 필드는 여러 줄입니다.
아니요! CSV는 여러 줄을 지원하지 않습니다. 절대적으로하지.
여러 줄의 문자열을 CSV에 저장해야 하는 경우 두 가지 일반적인 방법이 있습니다.
\n
원래 문자열의 문자를 다른 문자로 변경합니다. 일반적으로 두 글자로 된 "\n" 문자열입니다.- 레코드 구분 기호를
\n
문자열에 나타나지 않는 다른 문자로 변경합니다. 대개는 그런 것입니다\x01
.
첫 번째 방법은 추가 사전 및 사후 변환이 필요하지만 상당히 안정적입니다.
두 번째 방법은 매우 훌륭하고 간단하게 작동하지만 CSV를 지원하는 모든 응용 프로그램이 레코드 구분 기호를 변경할 수 있는 것은 아니며 레코드 구분 기호로 사용된 문자가 필드 내부에 나타날 가능성이 항상 있습니다.
어떤 이유로 파일을 다시 생성하고 올바른 CSV로 만들 수 없는 경우 루프를 사용하는 것이 좋습니다.
while read row
if row has 6 fields ("Notes" is a 6th field)
do
append "\n" to it
append next row to it
repeat until the working row has 10 fields
export the work row to output file
end if
end while
어떤 언어라도 가능합니다(심지어 bash
).