파일의 지정된 오프셋에 줄을 인쇄합니다.

파일의 지정된 오프셋에 줄을 인쇄합니다.

한 줄에 50자, 총 50줄의 파일이 있습니다. 파일의 각 줄에는 문자가 포함됩니다. 문자 일련 번호(예: 52)를 지정하고 *주어진 문자 앞에 적절한 문자 줄을 인쇄하고 싶습니다 .

답변1

사양을 하드코딩하는 한 가지 방법은 오프셋(줄바꿈 무시)을 기준으로 행과 열 번호를 계산하고 이 값을 사용하여 올바른 행을 선택하고 올바른 열을 강조 표시하는 것입니다.

입력 파일에는 in50줄이 있으며 다음과 같습니다.

00ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
01ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
02ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
03ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
04ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv

그러면 다음 스크립트가 요구 사항을 대략적으로 충족해야 합니다.

while read -p '> ' n; do
    n=$((n - 1))
    line=$((n / 50 + 1))
    col=$((n % 50))
    <in sed -n -e "${line}p" | sed "s/^.\{${col}\}/&*/g"
done

상호작용 예시:

> 1
*00ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
> 2
0*0ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
> 49
00ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrst*uv
> 50
00ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu*v
> 52
0*1ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
> 125
02ABCDEFGHIJKLMNOPQRSTUV*WXYZabcdefghijklmnopqrstuv

sed에 대한 첫 번째 호출은 올바른 행을 선택하고 두 번째 호출은 *올바른 열에 a를 삽입합니다.

답변2

linemod50(){
        dd bs=51 skip="$(($1/50))" count=1 | {
            dd bs=1 count="$(($1%50-!!($1%50)))"
            IFS= read -r rem
            printf "*%s\n" "$rem"
        }   2 >/dev/null
    }
    i=      forty9=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
    while   [ "$((i+=1))" -le 50 ]
    do      echo "$((i%10))$forty9"
    done    >file
    linemod50 478 <file

1+0 records in
1+0 records out
51 bytes (51 B) copied, 9.5153e-05 s, 536 kB/s
0abcdefghijklmnopqrstuvwxyz*ABCDEFGHIJKLMNOPQRSTUVW

dd오프셋을 직접 찾기 때문에 아마도 가장 효율적인 솔루션일 것입니다 . 그러나 와이드 문자에서는 작동하지 않으며 파이프 입력으로 인해 예상치 못한 결과가 발생할 수 있습니다.

이는 C 언어 환경에서 검색 가능한 입력을 제공하는 훌륭한 솔루션입니다.

답변3

GNU 또는 FreeBSD 사용 sed( -r확장 정규식 옵션의 경우):

스크립트는 줄의 시작 부분과 문자 위치로 래핑됩니다. 이를 원하지 않으면 해당 while줄을 주석 처리하거나 제거하세요.

#! /bin/bash

for O in "$@" ; do
   while [[ "$O" -gt 50 ]] ; do O=$(( $O -50 )) ; done
   O1=$(( $O - 1 ))
   sed -r -n "$O s/^(.{$O1})(.*)/\1\*\2/ p" input.txt
done


$ for i in {1..50} ; do printf "%02i%s\n" "$i" "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv" ; done > input.txt

$ ./offset.sh 3 10 52 100
03*ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
10ABCDEFG*HIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
0*2ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv
50ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu*v

관련 정보