파일의 한 줄에 있는 2개의 하위 문자열을 명령줄의 다른 파일에 있는 2개의 다른 줄로 바꿉니다.

파일의 한 줄에 있는 2개의 하위 문자열을 명령줄의 다른 파일에 있는 2개의 다른 줄로 바꿉니다.

여러 줄이 포함된 텍스트 파일이 있습니다. 줄 중 하나는 다음과 같습니다.

fixed_stringA = 123, fixed_stringB = 456

두 번째 텍스트 파일이 있습니다(역시 여러 줄 포함). 이 두 줄은 다음 순서로 파일 중간에 있습니다.

found_value1=unknown1  
found_value2=unknown2

내 목표는 두 번째 텍스트 파일의 이 두 줄을 수정하여 이제 다음과 같이 읽는 것입니다.

found_value1=123  
found_value2=456

내 목표는 다른 스크립트를 호출하지 않고 명령줄에서 이 작업을 수행하는 것입니다. 다음 코드는 작동하지만 단축하거나 개선할 수 있는지 궁금합니다.

value_variable=$(grep "fixed_stringA = [0-9]*, fixed_stringB = [0-9]*" first_file \
| sed -E 's/fixed_stringA = ([0-9]+), fixed_stringB = ([0-9]+)/\1,\2/'); \
value1=$(echo $value_variable | cut -d "," -f 1); \ 
value2=$(echo $value_variable | cut -d "," -f 2); \
sed -i -E "s/unknown1/$value1/" second_file.txt; \
sed -i -E "s/unknown2/$value2/" second_file.txt

답변1

이 두 줄로 요약할 수 있습니다.

values="$(sed -n -E 's/^.*fixed_stringA\s*=\s*([0-9]+)\s*,\s*fixed_stringB\s*=\s*([0-9]+).*$/\1,\2/p' first_file)"
sed -i -E -e "s/unknown1/${values%,*}/" -e "s/unknown2/${values#*,}/" second_file.txt

첫 번째 줄은 -n플래그와 함께 sed를 사용하여 일반 출력을 억제하고 대상 줄을 찾아 숫자 값을 캡처 그룹으로 추출한 \1다음 개별적으로 인쇄하고 변수에 저장하도록 \2변환합니다 .123,456$values

second_file.txt다음 줄에서는 for에서 쉼표 앞의 모든 내용과 for에서 쉼표 뒤의 모든 내용을 두 가지로 대체합니다 .$valuesunknown1unknown2

그러나 나는 awk 내보내기가 언제든지 라인을 가질 것이라고 확신합니다.

답변2

경험상 grepwith를 사용하면 자체적으로 필터링할 수 sed있으므로 거의 항상 중복됩니다 . sed귀하의 경우 p명령의 플래그를 사용하여 s일치하는 경우에만 인쇄한 다음 d일반 출력을 억제하도록 선택할 수 있습니다.

sed -E 's/fixed_stringA = ([0-9]+), fixed_stringB = ([0-9]+)/\1,\2/p;d' first_file

다음으로 대체 문자열을 일반적으로 예약된 공간에 저장하여 두 번째 파일에 적용할 수 있지만 nsplace 편집에서는 작동하지 않으므로 -i두 번째 명령이 필요합니다 sed. 첫 번째 스크립트를 사용하여 두 번째 스크립트에 대한 스크립트를 생성해 보겠습니다.

sed -i.bak $(sed -E 's/fixed_stringA = ([0-9]+), fixed_stringB = ([0-9]+)/s_unknown1_\1_;s_unknown2_\2_/p;d' first_file) second_file

내부 스크립트는 s_unknown1_123_;s_unknown2_456_두 번째 파일에 필요한 스크립트인 출력을 생성합니다.

-i.bak참고: 저는 다른 버전과의 호환성 에 익숙하며 sed소스 파일을 망칠 경우를 대비해 복사본을 보관합니다.

관련 정보