sed를 사용하여 문자가 포함된 줄을 변수에 저장된 텍스트로 바꾸는 방법은 무엇입니까?

sed를 사용하여 문자가 포함된 줄을 변수에 저장된 텍스트로 바꾸는 방법은 무엇입니까?

다음 텍스트가 포함된 파일entry.txt가 있습니다.

$ cat entry.txt 
>Main entry
This is some text to try
how to substitute the first
line of the text.

>문자를 검색하여 첫 번째 줄을 바꾸고 변수에 저장된 일부 텍스트를 추가하고 싶습니다 .

$ var=TITLE
$ sed -i "s/>*/$var/" entry.txt 
$ cat entry.txt 
TITLEMain entry
TITLEThis is some text to try
TITLEhow to substitute the first
TITLEline of the text.

내가 어떻게 할 수있는

  1. >>포함되어 있고 분리되지 않은 전체 줄을 바꿉니다 .

  2. 첫 번째 줄만 바꾸고 다른 줄은 바꾸시겠습니까?

감사해요.

답변1

패턴은 ^>.*( )로 시작하는 줄만 일치해야 하며 해당 줄( )의 다른 모든 항목과 일치해야 합니다. 그래서:>^>.*

sed -i "s/^>.*/$var/" entry.txt

답변2

원하는 결과를 대부분 추측할 수 있지만 예상되는 결과를 제공하면 도움이 될 것입니다. 귀하의 테스트 사례는 첫 번째 줄 제약 조건이 아닌 ">" 교체 요구 사항만 다루고 있습니다. 또한 ">"가 줄의 첫 번째 문자가 아닌 경우도 해결되지 않습니다. "-i"(파일을 제자리에서 편집) 대신 "-e"(표준 입력을 표준 출력으로 변경)를 사용하여 sed를 테스트하는 것이 더 쉽습니다.

어쩌면 우리는 다른 테스트 케이스를 시도해 볼 수도 있습니다:

>Main entry>
This is some text to try
>how to substitute the first
line of the text.

sed -i "s/>*/$var/" 항목.txt

여기서 패턴은 0개 이상의 ">" 인스턴스와 일치하는 것을 의미하지만 실제로는 적어도 하나의 인스턴스와 일치하려고 합니다. 여러 인스턴스를 어떻게 처리할 예정인가요? 줄의 시작 부분에서만 일치해야 합니까? )

var=INJECT
sed -e "s/.*>.*/$var/" <entry.txt
INJECT
This is some text to try
INJECT
line of the text.

이게 좀 더 나아 보이는데요.

하지만 sed가 도달하도록 놔두세요오직첫 번째 줄을 바꾸는 것은 훨씬 더 어렵습니다. Gnu sed를 사용하면 다음과 같이 가능합니다.

sed -e "0,/.*>.*/s//$var/" <entry.txt
INJECT
This is some text to try
>how to substitute the first
line of the text.

이것은아마도전통적인 sed에서는 다른 방법으로 이 작업을 수행하는 것이 가능하지만 이를 달성하기 위해 포기하고 awk를 사용했습니다.

답변3

사용 awk:

첫 번째 레코드를 변경하려면( >레코드 시작 부분에 발생하는 경우) 다음을 사용할 수 있습니다.

$ awk -v var="$var" '/^>/ && NR==1{$0 = var}1'

>줄 시작 부분에 나타나는 첫 번째 인스턴스의 첫 번째 줄을 변경하려면 다음 명령을 사용할 수 있습니다.

$ awk -v var="$var" '/^>/ && !a{$0 = var; a++}1'

관련 정보