다음 파일이 있다고 가정 해 보겠습니다.
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 포함, sed
4.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