sed는 특정 위치에 문자를 삽입합니다.

sed는 특정 위치에 문자를 삽입합니다.

*.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입니다.

(후자는 원래 질문과는 약간 다릅니다 ...)

관련 정보