다음 텍스트가 포함된 파일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
패턴은 ^>.*
( )로 시작하는 줄만 일치해야 하며 해당 줄( )의 다른 모든 항목과 일치해야 합니다. 그래서:>
^>
.*
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'