![fileA에서 문자열을 찾고, 해당 문자열에서 일부 텍스트를 선택하고, fileB에서 문자열을 바꾸는 방법은 무엇입니까?](https://linux55.com/image/116021/fileA%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%B0%BE%EA%B3%A0%2C%20%ED%95%B4%EB%8B%B9%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%EC%84%9C%20%EC%9D%BC%EB%B6%80%20%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%84%A0%ED%83%9D%ED%95%98%EA%B3%A0%2C%20fileB%EC%97%90%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
파일 A와 파일 B가 있습니다. 존재하다파일 A, 내 스크립트가 특정 stringA를 찾을 수 있기를 원합니다. 그런 다음 sed
명령을 사용하여 stringA의 일부만 붙여넣습니다.문서 B(특정 stringB의 일부로 대체됨문서 B).
예를 들어.
파일 A 아시지카 허스테드 아시직 다지드 권장 무게:0.546(관심 문자열입니다)
문서 B 아스다 기스크다 크자쉬 자흐스테드 워킹그룹HT 0.495(FILE BI의 교체가 필요한 부분입니다)
stringA(0.546)의 텍스트를 선택하고 fileB의 0.495를 0.546으로 바꾸고 싶으므로 새 fileB는 다음과 같습니다.
새 파일 B 아스다 기스크다 크자쉬 자흐스테드 무게 0.546
sed
같은 파일에서 stringA를 stringB로 바꾸지만 내 stringsA와 B가 다른 파일에 있기 때문에 사용하는 것은 나에게 적합하지 않습니다. 또한 "무작위로"(프로그래밍 방식으로) 생성됩니다.
답변1
sed
(및 첫 번째 파일과 일치하는 다른 도구)를 사용하여 실제로 이 작업을 수행할 수 있습니다 . 예를 들어:
$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546
또는 먼저 변수에 저장하십시오.
$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546
답변2
awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2
out2
그러면 원하는 출력 데이터가 포함된 새 파일이 생성됩니다 . 그런 다음 원하는 곳으로 이동할 수 있습니다.
$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546
답변3
이 스크립트는 new_file_b.txt
.
용법: ./script.sh file_a.txt file_b.txt > new_file_b.txt
#!/bin/bash
awk '
/Recommended Weight: /{
value=$3;
}
NR != FNR {
if($1 == "WGHT") {
print $1 OFS value;
} else {
print;
}
}
' "$1" "$2"
답변4
GNU sed
다음과 같이 진행할 수 있습니다 :
sed -Ez '
N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB
-E
켜져 있으면 extended regex facility
이 -z
옵션은 각 파일을 단일 문자열로 처리하고 여러 파일을 \0
null( )로 구분합니다.