새 항목을 삽입할 때 목록 번호 다시 매기기

새 항목을 삽입할 때 목록 번호 다시 매기기

번호가 매겨진 항목이 포함된 텍스트 파일이 있습니다.

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보다 큰 경우. FSbeing 의 경우 .이는 현재 행에 최소한 하나의 가 포함되어 있는지 여부를 의미합니다 .. 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-ACtrl-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

관련 정보