두 개의 코드 파일이 있습니다. 첫 번째 파일(File1)에는 포함할 여러 줄의 텍스트가 포함되어 있고, 두 번째 파일(File2)에는 첫 번째 파일의 일련의 줄로 대체될 문자열이 포함되어 있습니다. 첫 번째 파일에 포함된 행이 두 번째 파일에 포함되는 경우 각 행에 " & " 문자열을 따옴표 없이 추가해야 합니다. 또한 첫 번째 파일(File1)에서 특정 문자열의 검색 및 바꾸기를 출력 파일(File3)에서 바꿔야 합니다. 처음 두 파일의 예는 아래에 포함되어 있습니다.
파일 1
A A
B B
C C
D D
N 1 & 1 \\
Me 2 & 2 \\
Sd 3 & 3 \\
Dian 4 & 4 \\
E E
F F
G G
H H
파일 2
D D
C C
B B
A A
str_text1
H H
G G
F F
E E
아래 예는 새 출력 파일(File3)에 포함하려는 내용입니다. File1과 File2를 덮어쓰지 않았는지 확인하고 모든 내용을 새 파일 File3으로 재구성해야 합니다.
파일 3
D D
C C
B B
A A
& N 1 & 1 \\
& $\m$ 2 & 2 \\
& $\sig$ 3 & 3 \\
& $\dian{x}$ 4 & 4 \\
H H
G G
F F
E E
저는 이것이 쉘 스크립트의 한 줄이기를 원합니다. 아래는 제가 지금까지 가지고 있는 것의 예입니다. 마지막 라이너를 동일한 라이너로 교체하는 방법을 모르겠지만 두 번째 라이너로는 매우 간단합니다. 이것들이 결합될 수 있다면 감사하겠습니다.
코드 1
sed -e 's/str_text1/ \& $(sed -n 5,8p File1.txt)/' \
< File2.txt > File3.txt
코드 1 출력* 행을 포함할 수 없습니다. 큰따옴표를 사용하면 오류가 발생합니다: sed: -e expression #1, char 18: unterminated `s' command
.
D D
C C
B B
A A
& $(sed -n 5,8p File1.txt)
H H
G G
F F
E E
코드 2검색 및 교체가 쉽고 그대로 잘 작동합니다. 그러면 새 File3 파일에 있는 File1의 첫 번째 열에 있는 일부 문자열이 대체됩니다.
sed -i -e 's/Me/$\m$/g' \
-i -e 's/Sd/$\sig$/g' \
-i -e 's/Dian/$\dian{x}$/g' \
File3.txt
답변1
내가 올바르게 이해했다면 코드 1과 2를 실행한 후 보고 있는 최종 출력은 다음과 같습니다.
D D
C C
B B
A A
& N 1 & 1 \\
& $\m$ 2 & 2 \\
& $\sig$ 3 & 3 \\
& $\dian{x}$ 4 & 4 \\
H H
G G
F F
E E
검색 및 대체 기능을 구현하고 조사하려면 awk와 gsub를 한 줄로 혼합하여 사용하는 것이 좋습니다.
#CODE1 : oneliner
awk -v a="$(awk 'NR==5, NR==8' File1.txt | sed -ie 's/\\/#/g' | sed -ie 's/&/@/g' | sed 's/^/ @ &/')" '{ gsub(/str_text1/,a); print }' File2.txt > File3.txt
#CODE2 : oneliner
sed -i -e 's/Me/$\\\m$/g' -i -e 's/Sd/$\\\sig$/g' -i -e 's/Dian/\$\\\dian{x}$/g' -i -e 's/@/\&/g' -i -e 's/#/\\/g' File3.txt
cat File3.txt
설명하다:
코드 1
이것과 동일 sed -n 5,8p File1.txt
하지만 gsub 유틸리티가 다음에 사용할 수 있도록 전체 결과를 awk 변수에 넣습니다.awk -v a="$(awk 'NR==5, NR==8' File1.txt)"
나는 사용하는 것을 선호한다앗바꾸다sed텍스트 파일에서 줄 범위를 가져오는 데 사용됩니다.awk 'NR==5, NR==8' File1.txt
특수 문자 \ 및 &를 각각 대체합니다.#그리고@;다음 명령(awk)의 경우 \ 및 &는 특수 문자이기 때문입니다.sed -ie 's/\\/#/g' | sed -ie 's/&/@/g'
바꾸다문자열 리터럴 1변수의 내용을 전달합니다.ㅏ gsub(/str_text1/,a); print
코드 2:
원하는 출력과 일치하도록 명령에 몇 가지 항목을 추가했습니다.sed -i -e 's/Me/$\\\m$/g' -i -e 's/Sd/$\\\sig$/g' -i -e 's/Dian/\$\\\dian{x}$/g'
이스케이프 문자로 사용한 문자를 다시 바꿉니다: @-> & # -> \sed -i -e 's/@/\&/g' -i -e 's/#/\\/g'