다양한 데이터 필드 목록을 함께 연결한 다음 더 많은 열을 추가해야 하는 스크립트가 있습니다. 생성된 파일은 다음과 같습니다.
$ cat compiled.csv
"name":"Network Rule 1", "description":"Network Rule 1", "from":["internal"], "source":["any"], "user":["domain\\network_user1"], "to":["external"], "destination":["host.example.com","10.1.2.1"], "port":["8443","22"],
"name":"Network Rule 2", "description":"Network Rule 2", "from":["internal"], "source":["any"], "user":["domain\\network_user2"], "to":["external"], "destination":["host.example.com","10.2.1.1"], "port":["23","25"],
"name":"Network Rule 3", "description":"Network Rule 3", "from":["internal"], "source":["any"], "user":["domain\\network_user3"], "to":["external"], "destination":["host.example.com","10.3.4.1"], "port":["80","143"],
목록에 더 많은 필드(모두 동일)를 추가하려고 합니다. 필드는 다음과 같습니다.
"접속": "허용", "시간": "00:00:00-23:59:59", "알림": "예"
최종 출력은 다음과 같아야 합니다.
"name":"Network Rule 1", "description":"Network Rule 1", "from":["internal"], "source":["any"], "user":["domain\\network_user1"], "to":["external"], "destination":["host.example.com","10.1.2.1"], "port":["8443","22"], "access":"allow", "time":"00:00:00-23:59:59", "notify":"yes"
"name":"Network Rule 2", "description":"Network Rule 2", "from":["internal"], "source":["any"], "user":["domain\\network_user2"], "to":["external"], "destination":["host.example.com","10.2.1.1"], "port":["23","25"], "access":"allow", "time":"00:00:00-23:59:59", "notify":"yes"
"name":"Network Rule 3", "description":"Network Rule 3", "from":["internal"], "source":["any"], "user":["domain\\network_user3"], "to":["external"], "destination":["host.example.com","10.3.4.1"], "port":["80","143"], "access":"allow", "time":"00:00:00-23:59:59", "notify":"yes"
스크립트와 셸에서 직접 다음 명령을 실행할 때 루프에 필드를 추가하려고 하면 이중 백슬래시가 사라집니다.
while read LINE; do
echo $LINE \"access\":\"allow\", \"time\":\"00:00:00-23:59:59\", \"notify\":\"yes\"
done < compiled.csv > completed_list.csv
대신 다음 예제에서 사용자 이름의 이중 백슬래시가 사라집니다.
"name":"네트워크 규칙 1", "설명":"네트워크 규칙 1", "from":["internal"], "source":["any"],"사용자": ["도메인\네트워크_사용자1"], "대상":["외부"], "대상":["host.example.com","10.1.2.1"], "포트":["8443","22"], "액세스":" 허용", "시간":"00:00:00-23:59:59", "알림":"예"
echo를 사용하여 전체 줄을 인쇄하는 데 문제가 있는 것 같은데, 이 문제를 해결할 수 있는 방법이 있나요?
미리 감사드립니다.
답변1
read
기본적으로 구분 기호에서 IFS 문자를 이스케이프하는 데 사용할 수 있는 백슬래시가 해석됩니다. 이 -r
옵션은 이를 끕니다.
$ read a b <<< '1\ 2 3'
$ printf "<%s>\n" "$a"
<1 2>
$ read -r a b <<< '1\ 2 3'
$ printf "<%s>\n" "$a"
<1\>
또한, 변수 이름만 지정하더라도 read
선행 및 후행 공백(IFS에 있는 경우)이 제거되므로 수정되지 않은 입력 라인을 얻으려면 IFS를 빈 문자열로 명시적으로 설정해야 할 수도 있습니다.
쉘과 설정에 따라 다음을 echo
수행할 수 있습니다 .반품인쇄할 때 백슬래시를 처리합니다. 를 사용하는 것이 더 좋습니다 printf "%s\n" "..."
.
또한 큰따옴표를 인쇄하는 경우 각 문자열을 개별적으로 이스케이프 처리하는 것보다 작은따옴표로 전체 문자열을 인용하는 것이 더 쉬울 수 있습니다.
아마도:
while IFS= read -r LINE; do
echo "$LINE"' "access":"allow", "time":"00:00:00-23:59:59", "notify":"yes"'
done < compiled.csv > completed_list.csv
그런 다음 각 줄 끝에 고정 문자열을 추가하는 것처럼 보이므로 대신 sed를 사용할 수 있습니다. 쉘보다 빠를 수 있습니다.
sed -e 's/$/ "access":"allow", "time":"00:00:00-23:59:59", "notify":"yes"/' < compiled.csv > completed_list.csv