루프로 인쇄할 때 이중 백슬래시가 사라집니다.

루프로 인쇄할 때 이중 백슬래시가 사라집니다.

다양한 데이터 필드 목록을 함께 연결한 다음 더 많은 열을 추가해야 하는 스크립트가 있습니다. 생성된 파일은 다음과 같습니다.

$ 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

관련 정보