![sed는 특정 위치에 문자를 삽입합니다.](https://linux55.com/image/82806/sed%EB%8A%94%20%ED%8A%B9%EC%A0%95%20%EC%9C%84%EC%B9%98%EC%97%90%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EC%82%BD%EC%9E%85%ED%95%A9%EB%8B%88%EB%8B%A4..png)
*.txt
공통 형식의 파일이 수백 개 있습니다 .
파일의 특정 위치에 쉼표를 삽입할 수 있습니다. 다음 코드를 일반화하여 *.txt
디렉터리의 모든 파일에 대해 여러 위치에 이를 적용하려면 어떻게 해야 합니까?
sed -i 's/^\(.\{4\}\)/\1,/' blank.txt
예를 들어 위치 4, 8, 22 등에 쉼표를 삽입합니다.
어쩌면 이런 게 있지 않을까요?
for i in *.txt; do
sed -i 's/^\(.\{4\}\)/\1,/' $i
done
답변1
안에일반적인당신이 이것을 할 수 있는 방법:
sed 's/./&,/4' <in >out
이렇게 하면 최소한 해당 문자 수를 포함하는 모든 입력 줄의 네 번째 문자에 출력 시 쉼표가 추가됩니다.
그리고 내 조언을 받아들인다면 일반적으로 다음과 같이 해야 합니다.아니요제공된 옵션 -i
중 하나로 전환하려면 스위치를 사용하십시오 .sed
답변2
맨 오른쪽부터 시작:
sed -i 's/./&,/22;s/./&,/8;s/./&,/4' ./*.txt
그렇지 않으면 첫 번째 대체가 두 번째 대체의 오프셋에 영향을 미칩니다. 하지만 언제든지 설명할 수 있습니다.
sed -i 's/./&,/4;s/./&,/9;s/./&,/24' ./*.txt
답변3
"4,8 및 22 위치에서"라고 말하면 sed는 "3,7 및 21 위치 이후"를 의미합니다. 기존 텍스트를 삽입하고 그대로 두려고 합니다.
이것? :
sed -i -r "s/^(.{3})/\1,/;s/^(.{7})/\1,/;s/^(.{21})/\1,/" $(dirname "$0")/blank.txt
-i = --in-place 즉 기존 파일에서 직접 변경, -r = 정규식, \1 = 대괄호 사이의 "그룹"을 참조, $(dirname "$0") = 현재 디렉터리에 유지
파일의 특정 위치에 공백 대신 탭을 설정하고 단일 공백으로 줄을 구분하려면 sed에서 다음과 같이 사용할 수 있습니다.
sed -i -r "s/^(.{10})./\1\t/;s/^(.{20})./\1\t/;s/^(.{30})./\1\t/" $(dirname "$0")/blank.txt
11, 21, 31번 위치의 문자를 탭 문자(이 경우 단일 공백)로 바꿉니다. 생성된 열 내의 공간은 변경되지 않습니다.
여전히 텍스트 편집기에서 열이 제대로 정렬/표시되지 않는다는 인상을 받습니다. 인코딩된 탭에는 버그가 없지만 일반적으로 텍스트 편집기의 기본 설정에서 탭 설정을 조정해야 합니다. 예를 들어 Geany -> 환경 설정 -> 편집기 -> 들여쓰기 -> 탭 너비는 4가 아닌 8입니다.
(후자는 원래 질문과는 약간 다릅니다 ...)