명령 대체 - cat 파일 삽입 따옴표

명령 대체 - cat 파일 삽입 따옴표

Bash에서 다음 파일이 제공됩니다.

$ cat noquotes.txt
s/a/b/g
$ cat quotes.txt
"s/a/b/g"

$ echo "aaa" | sed -e $(cat noquotes.txt)
bbb

성공했지만

$ echo "aaa" | sed -e $(cat quotes.txt)
sed: 1: ""s/a/b/g"
": invalid command code "

실패하다?

먼저 실행 해 보면 set -x알겠지만

$ echo "aaa" | sed -e $(cat noquotes.txt)
+ echo aaa
++ cat noquotes.txt
+ sed -e s/a/b/g
bbb

그리고

$ echo "aaa" | sed -e $(cat quotes.txt)
+ echo aaa
++ cat quotes.txt
+ sed -e '"s/a/b/g"'
sed: 1: ""s/a/b/g"
": invalid command code "

따라서 의 내용 주변에는 추가 따옴표가 삽입되었지만 noquotes.txt의 내용 주변에는 삽입되지 않은 것으로 보입니다 quotes.txt.

답변1

명령줄 처리에는 다음과 같은 단계가 있습니다.견적 삭제단계. 이는 일반적으로 명령이 실행되기 전에 발생하는 마지막 작업이며 명령에서 문자열을 인용하는 데 사용된 외부 인용문 세트를 제거합니다.

다음과 같은 명령의 경우

sed -e "s/a/b/g"

이 단계에서는 명령에 마지막 인수로 sed문자열이 제공되는지 확인하고s/a/b/g아니요 "s/a/b/g".

"s/a/b/g"명령 대체에서 파일을 사용하여 문자열을 읽을 때 cat따옴표는 원래 명령의 일부가 아니기 때문에 제거되지 않습니다(파일에서 읽은 데이터의 일부임).

이는 리터럴 문자열이 실행될 표현식으로 sed수신되므로 초기 값을 이해하지 못한다고 불평합니다 (명령이 필요함 )."s/a/b/g""sed

추적된 출력은 set -x디버그 출력으로만 처리합니다. 쉘은 bash추적에서 특정 문자를 포함하는 문자열 주위에 따옴표를 추가하므로 개별 인수의 인용된 내용을 나타내지 않습니다.실제로또는 호출된 유틸리티가 이를 해석하는 방법입니다.


sed그런데 파일에서 편집 스크립트를 실행 하려면 다음 -f옵션을 사용하십시오.

sed -f noquotes.txt <<<"aaa"

또한 y의 명령을 sed사용하면 with 대체 를 사용하는 것보다 더 효율적으로 개별 문자 집합을 음역할 수 있습니다 s. 귀하의 s/a/b/g대체품은 로 작성하는 것이 가장 좋습니다 y/a/b/.

만약 이것이라면오직이것이 필요한 경우 더 간단한 tr유틸리티를 사용하는 것이 더 효율적일 수 있습니다.

tr a b <<<"aaa"

답변2

따라서 quotes.txt 주위가 아닌 noquotes.txt 내용 주위에 별도의 따옴표가 삽입된 것으로 보입니다.

이것은 단지 Bash를 돕는 것입니다. Bash가 해석하는 기호가 있을 때마다 사물 주위에 따옴표를 붙인다는 것을 알 수 있습니다. 필요한 경우에만 따옴표를 사용하여 사용자와 동일하게 동작합니다. quote.txt에 다음 중 하나를 입력해 보십시오.

s/a$/a/g
s/"hi"/"bye"/g

목록은 매우 길 수 있습니다.

이제 원래 질문으로 돌아갑니다. 먼저 sed이상한 메시지를 인쇄합니다. set -x입력이 "s/a/b/g"이고 아닌 것이 분명 합니다 ""s/a/b/g". 나는 이 소식을 믿지 않을 것이다. GNU sed 4.2.1이 인쇄하는 내용은 다음과 같습니다 "s/a/b/g".

$ sed -e '"s/a/b/g"'
sed: -e expression #1, char 1: unknown command: `"'

매우 명확하게 말하면 첫 번째 문자는 명령 이름이고 이름이 지정된 명령이 없기 때문에 "무엇 sed을 해야할지 모르겠습니다.

관련 정보