여러 줄이 포함된 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
awk
GNU ( gawk
Linux 시스템의 기본값) 가 있는 경우 다음을 수행하여 파일을 제자리에서 편집할 수 있습니다.
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
바꾸 세요 .apples
WORD
--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