sed: 섹션 끝 앞에 텍스트 삽입

sed: 섹션 끝 앞에 텍스트 삽입

섹션이 끝나기 전에 HTML 파일에 일부 텍스트를 삽입해야 합니다 HEAD.

제 생각에는:

sed -i "s#</head>#<style> @page { prince-shrink-to-fit: auto }
.repository-with-sidebar.with-full-navigation .repository-content 
{width: 950px ! important;} </style>\n</head>#" ${1}"/"${2}"/"${i}.html

오류가 발생합니다.

sed: 1: command a expects \ followed by text

나는 내 실수를 보지 못했습니다. 스타일 주위에 작은따옴표를 사용해 보기도 했습니다.

섹션이 끝나기 전에 삽입하고 싶은 정확한 텍스트는 다음 HEAD과 같습니다.

<style>
@page { prince-shrink-to-fit: auto }
.repository-with-sidebar.with-full-navigation .repository-content 
{width: 950px ! important;}
</style>

편집: 이것은 정확한 명령입니다:

sed -i "s#</head>#<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 950px ! important;} </style>\n</head>#" ${1}"/"${2}"/"${i}.html

편집 2: 명령의 형식이 올바른지 확인하기 위해 다음도 시도하고 있습니다.

strToInsert='<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 950px ! important;} </style>'

sed -i "s#</head>#$strToInsert\n</head>#" ${1}"/"${2}"/"${i}.html

이를 통해 내가 삽입한 텍스트에 문제가 있을 수 있다는 사실을 깨달았습니다.

답변1

내부 프로세스 sed중에 백업 파일을 생성해야 합니다 . 이것-iApple의 옵션에는 sed확장 매개변수가 필요합니다.(생성된 백업 파일의 경우) 다음 매개변수를 사용합니다. 이는 #s</head>#...확장자가 " "인 백업 파일을 생성하겠다는 뜻을 의미합니다 .

오류는 귀하가 참조하고 있다고 생각한다는 것을 의미합니다.a일시 중지 명령. 내 추측 값 $1a. -iate 앞의 인수는 sed이것이 변경될 파일의 ​​경로가 아니라 실행될 스크립트라고 생각하기 때문에 적절한 오류가 발생합니다. 이것은 정확히 Apple sed및 잘못된 명령에서 a발생하는 오류 입니다.

$ sed a
sed: 1: "a": command a expects \ followed by text

-i명령에 확장 매개변수를 제공하십시오 sed.

sed -i.bak "s#</head>#<style> @page { prince-shrink-to-fit: auto } .repository-with-sidebar.with-full-navigation .repository-content {width: 50px ! important;} </style>\n</head>#" "${1}/${2}/${i}.html"

그러면 모든 것이 작동할 것입니다(단, \n개행 이스케이프는 아닙니다). 작은따옴표를 사용하는 경우 "" 안의 공백을 제거할 수도 있습니다 !important.

sed위 코드는 GNU에서도 작동하지만 주의하세요.-iPOSIX 옵션이 아닙니다.그리고 일반적으로 휴대하기가 쉽지 않습니다.

어쨌든 내부 수정을 사용하지 않고 명시적으로 파일 복사를 직접 처리하는 것이 일반적으로 권장됩니다. 그러나 그것은 당신에게 달려 있습니다.


${1}변수 확장 등을 인용해야합니다 . 슬래시는 항상 리터럴이므로 단순히 인용하는 것은 의미가 없습니다.

답변2

죄송하지만 당신의 진술을 읽어보세요HEAD 섹션 끝에 삽입하려는 정확한 텍스트는 다음과 같습니다.처음에는 파일 섹션에 텍스트를 삽입하는 것이 아니라 파일 섹션에 텍스트를 추가하는 것에 대해 이야기하고 있다고 믿게 되었습니다. 그래서 처음에 이 답변을 썼습니다. 질문을 다시 읽고 예제 sed명령을 더 자세히 살펴본 후 이것이 실제로 일치하기 전에 텍스트를 삽입한다는 것을 이해했다고 생각합니다. 따라서 이 답변도 이제 여기에 있습니다. 아래에서 수행할 지침을 찾을 수 있습니다.

i줄의 머리/꼬리 부분에 임의의 문자열을 안전하게 삽입하거나 추가하려면 몇 가지 옵션이 있으며 각 옵션은 마지막 옵션보다 더 복잡합니다.ased

첫 번째이자 가장 간단한 것은 read 명령입니다. 이스케이프가 전혀 필요하지 않습니다. 예를 들어, 추가하려는 문자열이 파일에 있는 경우 ./append다음을 수행할 수 있습니다.

sed '\|</head>|r ./append' <infile >outfile

아니면 삽입하세요.첫 번째일치 과정에서 다음과 같은 약간의 미리보기 기능을 사용하여 인쇄하기 전에 한 주기를 일치시킬 수 있습니다.

sed -e '$!N;\|\n</head>|r ./insert' -e 'P;D' <infile >outfile

그러나 ead는 stdout에 쓰도록 지정되었습니다. 이것이 nplace 옵션과 r어떻게 작동하는지 잘 모르겠습니다.-i(어쨌든 내 생각에는 이것은 대부분 추악한 해킹입니다). 나생각하다rint와 동일한 작업을 sed수행 하고 stdout을 명명된 nplace 편집 파일 로 리디렉션해야 합니다 .p-i

a또 다른 옵션은 보류 명령을 사용하는 것입니다 .추가그건. 이 작업을 안전하게 수행하려면 \n줄과 백슬래시 만 벗어나면 됩니다 . 다음을 수행할 수 있습니다.

printf %s\\n "$str_to_append" |
sed 's|\\|&&|g;$!s|$|\\|;1i\
    \\|</head>|a\\' |
sed -f - infile >outfile

a그러나 pend의 동작은 ead의 동작으로 지정되므로 다시 n-place 해킹에서 어떻게 동작할지 r잘 모르겠습니다 .-i

a\\위의 내용을 w/로 바꾸면 표준 출력에 텍스트가 삽입 i\\됩니다.i(또는 -inplace edit-file로 명명 - 구현에 적합한 경우) 앞으로패턴 공간이 기록됩니다.

추가 작업을 좋아한다면,(또는 내가 생각할 수 있는 유일한 실제 사용에서는 행당 여러 개의 read/pend를 특정 순서로 정렬합니다.)ar이전에 ead에서 했던 것처럼 삽입에도 사용할 수 있습니다 .

printf %s\\n "$str_to_append" |
sed 's|\\|&&|g;$!s|$|\\|;1i\
    \\|\\n</head>|a\\' |
sed -e '$!N' -f - -e 'P;D' infile >outfile

내가 제공한 마지막 것은 탈출해야 한다는 점을 제외하면 거의 동일합니다 &.구분 기호 (대개 /). 다음과 같이 작동합니다.

printf %s\\n "$str_to_append" |
sed 's|[\/&]|\\&|g
   $!s|$|\\|;$s|$|/|
     1i\
     /<\\/head>/s/^/\\' |
sed -f - infile >outfile

이는 삽입에 영향을 미칩니다. 이 방법으로 문자열을 추가하려면 간단히 a를 ^a로 바꾸면 됩니다.$

-i해당 옵션을 추가하든 안 하든 효과가 있을 것이라고 확신합니다.

-i마지막으로 다음을 사용하는 대신 이 작업을 수행할 수도 있습니다.

sed '$d;\|</head>|r ./append' <<IN >infile
$(   cat <infile; echo .)
IN

...또는 삽입의 경우:

sed -e '$d;N;\|\n</head>|r ./insert' -e 'P;D' <<IN >infile
$(   cat <infile; echo .)
IN

...이것이 당신을 얻을 것입니다네펠레-i영향을 미칠 수 있는 예상치 못한 권한 문제 없이 바로 편집할 수 있습니다 .

관련 정보