텍스트 파일이 있다고 가정해 보겠습니다.변경할 파일.txt:
3.141592 pi
6.626068 planck
# Like this and like that and like this
..1 kd6-officer kd6-officer
us..0 kd6-3.7
us00..0 kd6-3.8
us00..0 kd6-3.9
us00..0 kd6-3.1
두 번째 파일도 있어요.하위파일.txt:
subtext
두 번째 열의 두 번째 행에 있는 단어를 바꾸고 싶습니다.변경할 파일.txt이 단어는 에하위파일.txt;이 단어는하위파일.txt항상 그런 것은 아닙니다 subtext
.변경할 파일.txt항상 이렇지는 않을 것입니다 planck
. 두 파일의 두 단어가 모두 다음과 같다고 가정하는 것이 가장 좋습니다.언제나완전히 다른 말입니다.
답변1
2행이 끝나기 전에 공백이 아닌 문자를 변경하려면 다음을 사용할 수 있습니다.
sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt
이 -i''
옵션은 파일을 제자리(GNU/BSD sed)에서 편집합니다. 의 단어에는 문자가 subfile.txt
포함될 수 없습니다 /
. 또는 /
명령에서 단어에 존재하지 않는 문자(예: @
또는 ,
)로 바꿔야 합니다.
답변2
필드 사이의 공백을 유지하는 데 신경 쓰지 않는다면 입력 파일에 문자가 주어지면 모든 UNIX 시스템의 모든 쉘에서 awk를 사용할 수 있습니다. 이는 리터럴 문자열 할당만 수행하기 때문입니다.
awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt
정말로 관심이 있다면:
awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt
GNU awk를 사용하여 match()의 세 번째 인수로 Y 줄의 단어 X를 바꾸려면 다음을 수행하세요.
awk -v x=5 -v y=3 '
NR==FNR { new=$0; next }
FNR==y {
match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
$0 = a[1] new a[3]
}
1' subfile.txt filetobechanged.txt
예를 들어:
$ cat subfile.txt
[[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]]
$ cat filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds that lour'd upon our house
In the deep bosom of the ocean buried.
$ awk -v x=5 -v y=3 '
NR==FNR { new=$0; next }
FNR==y {
match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
$0 = a[1] new a[3]
}
1' subfile.txt filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds [[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]] lour'd upon our house
In the deep bosom of the ocean buried.
비슷한 일을하고 싶다면 sed
참조하십시오.https://stackoverflow.com/q/29613304/1745001.