sed 명령을 사용하여 문자열의 일부를 카운트다운 숫자로 바꿉니다.

sed 명령을 사용하여 문자열의 일부를 카운트다운 숫자로 바꿉니다.

문자열이 있습니다. TestTest12312313. 명령을 사용하여 이 문자열의 숫자를 카운트다운 숫자로 바꾸려고 하므로 13출력은 다음과 같습니다.-1,-2,-3,-4, ....sed

TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
.....
.....
.....

답변1

이 시도:

파일에는 다음 코드가 있습니다

INPUT=$1
CONTENT=`echo "$INPUT" | cut -c1-14`
COUNT=`echo "${INPUT#"$CONTENT"}"`
for i in $(seq 1 "$COUNT")
do
        echo "$CONTENT-$i"
done

다음과 같이 런타임 입력을 사용하여 스크립트를 실행합니다.

sh file.sh TestTest12312313
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6
TestTest123123-7
TestTest123123-8
TestTest123123-9
TestTest123123-10
TestTest123123-11
TestTest123123-12
TestTest123123-13

답변2

노력하다

string='TestTest12312313' 
printf '%s\n' ${string%??}-{1..100}

이것${parameter%word}쉘 매개변수 확장매개변수에서 마지막 두 문자를 제거합니다.


위에서 100을 계속 인쇄하려는 숫자로 조정할 수 있습니다.

반복해서 인쇄하려는 경우정확히 마지막 두 자리입니다이 시점에서 다음을 수행할 수 있습니다.

string='testString07'
eval printf '%s\\n' ${string%??}-{1..${string:((${#string}-2))}}
testString-01
testString-02
testString-03
testString-04
testString-05
testString-06
testString-07

${string:((${#string}-2))}구문은 다음에서 유래합니다.쉘 하위 문자열 확장 ${parameter:startPosition:length}(만약에length생략하면 반환됩니다.startPOsition끝까지. )어디출발점예, ((${#string}-2))문자 길이를 다음과 같이 반환합니다.string범위마이너스 2.

음, 이는 다음과 같이 단순화될 수도 있습니다.

eval printf '%s\\n' ${string%??}-{1..${string#${string%??}}}

단일 문자열이 아닌 파일인 경우 awk다음과 같은 것을 사용하는 것이 좋습니다.

awk -F'..$' '{print $1"-"NR}' infile

이는 awk의 필드 구분 기호를 각 줄의 마지막 두 문자로 설정한 다음( ..$줄의 마지막 두 문자만 일치하는 정규식입니다) 첫 번째 필드와 그 필드를 인쇄합니다.질소수량오른쪽하이픈으로 구분된 레코드입니다. 이는 다음과 같이 단축됩니다.

awk -F'..$' '$0=$1"-"NR' infile

답변3

그리고 awk:

$ echo 'TestTest12312313' | awk '{ s = substr($0, 1, length - 2); while (1) printf("%s-%d\n", s, ++n) }'
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6
TestTest123123-7
TestTest123123-8
TestTest123123-9
(etc., forever...)

awk코드는 입력 줄(문자열)을 추출하고 마지막 두 문자를 제거하여 결과를 변수에 저장합니다 s. 그런 다음 무한 루프에 들어가 위에 표시된 형식으로 계속 증가하는 정수와 함께 해당 문자열을 인쇄합니다.

답변4

다음 세리프를 사용하여 이 작업을 수행할 수 있습니다.

$ a=1; for i in $(sed 's/13$//' inputfile);do echo "${i}-$((a++))"; done
TestTest123123-1
TestTest123123-2
TestTest123123-3
TestTest123123-4
TestTest123123-5
TestTest123123-6

관련 정보