SED에서 줄 번호 목록을 사용하여 특정 줄에 단어 추가

SED에서 줄 번호 목록을 사용하여 특정 줄에 단어 추가

여러 줄이 포함된 example.txt 파일이 있습니다.

Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!

임의의 줄번호 4개로 파일을 생성한 후

sed -n '=' example.txt | shuf | head -3 > line_numbers.txt

line_numbers.txt의 줄 번호에 다음이 포함되어 있다고 가정합니다.

1
3
6

line_numbers.txt의 각 줄에 WORD라는 단어를 추가하여 example.txt를 편집하고 싶습니다. 여기에는 "pants"("underpants"와 같은 부분 단어 대신)라는 완전한 단어가 포함되어 있습니다.

어떻게 해야 하나요?

example.txt가 이렇게 보이길 원합니다

Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!WORD

편집하다:

완전한 단어만 찾으려면 source_word를 다음과 같이 작성해야 합니다 \<source_word\>.

다른 가능한 예:

다음 줄이 포함된 다른 파일이 있습니다.

I love apples.
You hate pineapples.
Apple pie is delicious.
Why do you do not like eating an apple?
We prefer pears to apples.
How many apples do you want to eat?
I have to bake three apple pies for sunday.

세 개의 임의의 줄 번호가 포함된 목록이 있습니다.

6
2
4

--OK줄에 완전한 단어가 포함되어 있는 경우 에만 각 줄의 끝에 추가하고 싶습니다 apples.

출력은 다음과 같아야 합니다.

I love apples.
You hate pineapples.
Apple pie is delicious.
Why do you do not like eating an apple?
We prefer pears to apples.
How many apples do you want to eat?--OK
I have to bake three apple pies for sunday.

답변1

나도 방법이 있었으면 좋겠지만 개인적으로는 이 복잡한 작업이 훨씬 더 쉽다고 sed생각합니다 .awk

awk 'NR==FNR{a[$1]++; next} 
    { 
        s=tolower($0); 
        if(FNR in a && s~/pants/){$0=$0"WORD"}
    }1' line_numbers.txt examples.txt 
Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!WORD

awkGNU ( gawkLinux 시스템의 기본값) 가 있는 경우 다음을 수행하여 파일을 제자리에서 편집할 수 있습니다.

gawk -i inplace 'NR==FNR{a[$1]++; print; next} 
                { 
                    s=tolower($0); 
                    if(FNR in a && s~/pants/){$0=$0"WORD"}
                }1' line_numbers.txt examples.txt 

또는 다음 내용을 잃어도 괜찮다면 약간 더 간단합니다 line_numbers.txt.

gawk -i inplace 'NR==FNR{a[$1]++; next} 
                { 
                    s=tolower($0); 
                    if(FNR in a && s~/pants/){$0=$0"WORD"}
                }1' line_numbers.txt examples.txt 

답변2

다음 파이프라인은 수정된 버전이며 출력은 sed편집된 스크립트를 실행합니다.

sed -n '=' file | shuf -n 3 | sed 's,$, { /\\<pants\\>/ s/$/WORD/; },'

또는 동등하게,

awk '{ printf "%d { /\\<pants\\>/ s/$/WORD/; }\n", NR }' file | shuf -n 3

예를 들어, 이는 다음을 생성할 수 있습니다.

6 { /\<pants\>/ s/$/WORD/; }
5 { /\<pants\>/ s/$/WORD/; }
1 { /\<pants\>/ s/$/WORD/; }

무작위로 선택한 줄에서 패턴이 발생하는 경우 이 스크립트는 WORD패턴과 일치하는 각 줄의 끝에 추가되는 대체 항목을 적용합니다.pants

실행하려면 다음을 사용하여 간단히 읽으십시오 sed -f.

sed -n '=' example.txt | shuf -n 3 | sed 's,$, { /\\<pants\\>/ s/$/WORD/; },' |
sed -i -f /dev/stdin example.txt

또는 내 기반의 awk변형을 사용하십시오.

awk '{ printf "%d { /\\<pants\\>/ s/$/WORD/; }\n", NR }' example.txt | shuf -n 3 |
sed -i -f /dev/stdin example.txt

중간 파일은 필요하지 않습니다.

업데이트된 쿼리를 해결하려면 다음 으로 pants바꾸 세요 .applesWORD--OK

답변3

이것은 한 줄짜리 내용입니다(약간 길긴 하지만!).

텍스트 파일이 "tfile"이고 인덱스 파일이 ifile이라고 가정하고 다음을 수행합니다.

awk 'BEGIN{i=0;p=0}{if(FNR==NR){a[i++]=$1} else {if(a[p]==FNR){p++;g="";if(index($0,"Pants")){g="WORD"};  print $0,g}else{print $0}}}' ifile tfile

당신은 얻을 것이다:

Larry is funny! 
Funny, I've no glue!
Look here! 
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet! WORD 

답변4

GNU sed를 사용하면 줄 번호 파일에서 sed 코드를 구성하고 이를 데이터 파일에 적용할 수 있습니다.

sed -f - <<\eof line_numbers.txt |\
sed -f - example.txt
  1i /pants/I!b
  s/$/ba/
  $a b;:a;s/$/WORD/
eof

또 다른 방법은 sed 명령을 줄 번호로 표기하는 것입니다.

sed -e 's:.*:&s/pants.*/\&WORD/I;t:' line_numbers.txt |
sed -f /dev/stdin example.txt

관련 정보