여러 줄이 포함된 텍스트 파일이 있습니다. 줄 중 하나는 다음과 같습니다.
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에서 쉼표 뒤의 모든 내용을 두 가지로 대체합니다 .$values
unknown1
unknown2
그러나 나는 awk 내보내기가 언제든지 라인을 가질 것이라고 확신합니다.
답변2
경험상 grep
with를 사용하면 자체적으로 필터링할 수 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
소스 파일을 망칠 경우를 대비해 복사본을 보관합니다.