번호가 매겨진 항목이 포함된 텍스트 파일이 있습니다.
1. foo
2. bar 100%
3. kittens
4. eat cake
5. unicorns
6. rainbows
그리고 큰 숫자가 나올 때까지 계속됩니다. 그런 다음 빈 줄 다음에 새 블록이 1에서 시작됩니다.
예를 들어 4를 대체하여 새 항목을 삽입합니다. 그리고 블록의 모든 후속 항목에 번호를 다시 매겨야 합니다.
1. foo
2. bar 100%
3. kittens
4. sunshine <
5. eat cake
6. unicorns
7. rainbows
답변1
언제든지 구문을 사용하여 새 항목을 추가한 x. newentry
다음 다음을 사용하여 모든 항목의 번호를 다시 매길 수 있습니다.
awk -F . -v OFS=. '{if (NF) $1 = ++n; else n = 0; print}'
-F .
: 필드 구분 기호를.
1 로 설정-v OFS=.
: 같은산출필드 구분 기호(-F .
의 약어-v FS=.
)입니다.{...}
: 아니요상황따라서 내부 코드는{...}
각 줄마다 실행됩니다.if (NF)
, 필드 수가 0보다 큰 경우.FS
being 의 경우.
이는 현재 행에 최소한 하나의 가 포함되어 있는지 여부를 의미합니다.
.if (length)
비어 있지 않은 줄을 확인 하도록 할 수도 있습니다 .$1 = ++n
:첫 번째 필드 증분을 설정합니다n
(처음에는 0, 그 다음에는 1, 그 다음에는 2...).else n = 0
: else (NF == 0인 경우) n을 0으로 재설정합니다.print
:(수정될 수 있는) 줄을 인쇄합니다.
1 구문은 있지만 -F <extended-regular-expression>
단일 <extended-regular-expression>
문자인 경우 정규식( .
모든 문자가 표시되는 경우)으로 처리되지 않고 해당 문자로 처리됩니다.
답변2
다음을 통해 최대 치사율(및 복잡성! 및 버그!)을 달성할 수 있습니다.텍스트::자동 서식펄 모듈.
% < input
1. foo
2. bar 100%
3. kittens
4. it is getting dark. there may be a grue
4. no seriously, it's getting dark
4. really, you should find a light or something.
4. are you even paying attention? helloooo
4. eat cake
5. unicorns
6. rainbows
% perl -MText::Autoformat -0777 -ple '$_=autoformat $_, { all => 1 }' < input
1. foo
2. bar 100%
3. kittens
4. it is getting dark. there may be a grue
5. no seriously, it's getting dark
6. really, you should find a light or something.
7. are you even paying attention? helloooo
8. eat cake
9. unicorns
10. rainbows
%
실제 결과는 입력, 원하는 출력, 전달된 옵션 등에 따라 달라집니다.
답변3
VIM 솔루션
두 가지 해결 방법이 있습니다. 하나는 Ctrla선택 항목에서 자동으로 키를 누르는 것이고, 두 번째는 submatch(0)+1
선택 항목에서 모드 교체를 수행하는 것입니다. 첫 번째는 중요한 자동화입니다.
목록을 작성하여 시작하십시오.
1. foo
2. bar 100%
3. kittens
4. eat cake
5. unicorns
6. rainbows
항목을 삽입하다
1. foo
2. bar 100%
3. kittens
4. eat cake
4. sunshine
5. unicorns
6. rainbows
4. sunshine
명령 모드 위에 커서를 놓고 shift+를 누른 v다음 shift+를 누릅니다 g. 파일 끝까지 시각적 선택입니다. 일반적인 방법으로 커서를 블록 끝으로 이동할 수도 있습니다.
를 눌러 :
명령 모드로 들어가면 다음이 표시됩니다: :'<,'>
. 이제 다음을 입력하세요.
norm
Ctrl+ V Ctrl+A
Ctrl-v와 Ctrl-A의 기능은 "정확한" 키를 입력할 수 있도록 하여 ^A
강조 표시됩니다. 이것은 기본적으로 라고 말하고 for all lines selected, execute in normal mode keypress Ctrl-A
Ctrl-A는 기본적으로 커서 아래의 숫자를 증가시킵니다. 숫자가 바뀌는 걸 볼 수 있어요
실제 솔루션:
앞으로
뒤쪽에
Shiftv또 다른 방법은 before( , then ) 처럼 처음 반복되는 숫자에서 모든 항목을 선택한 G다음 명령 모드에서 실행하는 것입니다.
:'<,'>s/\v(^\d+)\./\=(submatch(0)+1).'.'/
답변4
번호 삭제:cut -d" " -f2- < list.txt > temp.txt
temp.txt에 행 삽입
숫자 만들기:cat -n temp.txt| sed -e 's/^[ ]*\([0-9]*\)[ \t]*\(.*\)/\1. \2/' > list.txt