bash: 파일의 지정된 위치에 문자 삽입

bash: 파일의 지정된 위치에 문자 삽입

다음 파일이 있다고 가정 해 보겠습니다.

word1          something       blabla
anotherword    somethingelse   asdf
yetanother     else            123

각 행에 대해 두 번째 열 앞에 주석을 추가해야 합니다. 이 주석은 항상 위치 15에서 시작합니다(예: #위치 15에 삽입됨). 어떻게 해야 합니까?

답변1

해당 옵션 sed이 GNU 또는 호환 가능하다고 가정¶-r

sed -r -e 's/^.{15}/&#/' file

밝혀지다

word1          #something       blabla
anotherword    #somethingelse   asdf
yetanother     #else            123

1 이는 확장된 정규식 지원을 위한 것입니다. 대부분의 다른 사람들은 이제 이것을 sed지원합니다 -E(버전 4.2의 GNU 포함, sed4.3까지 문서화되지 않았지만 이 답변이 원래 작성된 지 오래 후에 게시됨). 이것이 현재 POSIX 표준의 2023 버전에 있기 때문입니다. -E/가 없으면 를 사용 -r하게 됩니다 .\{...\}{...}

답변2

또 다른 해결책 awk:

awk '{$2="#"$2;print $0}' your_file

#이는 나타나는 위치마다 두 번째(공백으로 구분된) 열의 시작 부분에 추가됩니다 .

답변3

고정 너비 필드를 사용하려면 perl's pack/ unpack함수가 유용합니다.

$ cat file
word 1         something       blabla
anotherword    somethingelse123asdf
yetanother     else            123
$ perl -lne 'BEGIN {$format = "A15A16A*"}
             @f = unpack$format;
             $f[1] = "X$f[1]";
             print pack $format, @f' file
word 1         Xsomething      blabla
anotherword    Xsomethingelse12asdf
yetanother     Xelse           123

X두 번째 필드의 시작 부분에 삽입합니다. 두 번째 필드의 너비는 여전히 16바이트입니다. 이는 두 번째 줄의 경우 잘렸음을 의미합니다.

답변4

awk의 대답은 awk '{$2="#"$2;print $0}'공백 형식을 다시 지정하고 열 중 하나에 공백 문자가 있으면 실패하기 때문에 올바르지 않습니다.

word1          something       blabla
anotherword    somethingelse   asdf
yet another    else            123

예를 들어 다음과 같습니다.

word1 #something blabla
anotherword #somethingelse asdf
yet #another else 123

올바른 awk 답변은 다음과 같습니다. awk '{print substr($0,1,15) "#" substr($0,16) }'

출력은 다음과 같습니다.

word1          #something       blabla
anotherword    #somethingelse   asdf
yet another    #else            123

관련 정보