sed를 사용하여 문자열에서 첫 번째 X 문자를 어떻게 제거 할 수 있습니까?


126

작은 산업 상자에 임베디드 Linux 용 쉘 스크립트를 작성하고 있습니다. 텍스트를 포함하는 변수가 있습니다pid: 1234 있고 줄에서 첫 번째 X 문자를 제거하려고하므로 1234 만 유지됩니다. 더 많은 변수를 "정리"해야하므로 X 첫 문자를 잘라 내야하며 ${string:5}시스템에서 어떤 이유로 작동하지 않습니다.

상자가 가지고있는 유일한 것은 sed .

다음을 작동 시키려고합니다.

result=$(echo "$pid" | sed 's/^.\{4\}//g')

어떤 아이디어?


10
경우 ${string:5}당신은 배쉬 또는 다른 쉘을 지원하는 구문이를 사용하지 않는 한 후 작동하지 않습니다. 어떤 쉘과 버전을 사용하고 있습니까? 당신의 shebang은 어떻게 생겼습니까? 내 생각에 당신이 sh(예 dash:) 또는 가능 zsh합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


0

이것은 또한 일을 할 것입니다 :

echo "$pid"|awk '{print $2}'

27
이 질문은 "문자열에서 첫 번째 N 문자 건너 뛰기"에 대한 첫 번째 질문입니다. 질문에 대답하지 않았습니다.
jww

이 방법은 효과가없는 것 같습니다. 만약 그렇다면, 어떻게 설명 할 수 있습니까
Alexander Mills

내 시스템에서 작동합니다. 필드 구분 기호에 문제가있을 수 있습니다 () awk -F": " '{print $2}'. 아직도, 내가 좋아하는 솔루션은 아닙니다.
mzuther

197

다음이 작동해야합니다.

var="pid: 1234"
var=${var:5}

당신은시겠습니까 bash쉘 스크립트를 실행?

POSIX 호환도

var=${var#?????}

외부 프로세스를 사용하는 것이 바람직하지만 고정 길이 패턴의 형태로 5를 하드 코딩해야합니다.


1
두 번째 매개 변수를 사용하여 길이를 지정할 수도 있습니다. ${var:5:2}will at at 1및 return 12.
Max Candocia

107

다음을 사용하여 첫 번째 X 문자를 자르는 간결한 방법이 cut(1)있습니다. 이 예에서는 5 번째 문자로 시작하는 하위 문자열을 잘라서 처음 4자를 제거합니다.

echo "$pid" | cut -c 5-

2
이것이 가장 간단한 해결책입니다!
Brandon

2
기술적으로 OP는 sed를 요청했지만 이것이 "터미널 / bash의 문자열에서 첫 번째 X 문자를 제거하는 방법"에 대한 최상의 솔루션이라고 생각합니다. git과 함께 사용하면 좋습니다.git log --pretty=oneline | cut -c 42- | head
marksiemers

1
+1 간단하고 유용한 해결책. URL이 http : // <example.com>이고 프로토콜 'http : //'를 잘라낼 때 7이 아닌 8 자로 말해야합니다. ,하지만 그것이 나를 위해 일한 방식입니다.
Santosh Kumar Arjunan

1
Santosh Kumar Arjunan : "echo"$ pid "| cut -c 4-"예제는 실제로 처음 4자를 자르지 않고 4 번째 문자부터 시작하는 하위 문자열을 추출하기 때문입니다. 따라서 실제로 처음 3자를 자릅니다. 당신이 7 개 첫번째 문자를 차단하려는 경우 따라서, 당신은 8 번째 문자에서 추출 모든 것을 원하고, 따라서 실제로 할 "-c 컷을 8"
알 - 재

1
@DeanHiller cut -c ${LEN}-. 중괄호는 변수와 유효하지 않은 것을 구별하기 위해 문자열을 유효한 변수 문자로 연결하는 데 사용됩니다. 이에 대한 자세한 정보가 필요하면 "bash 변수 문자열 연결"을 찾아서 왜 / 어떻게 작동하는지에 대한 추가 자료를 찾으십시오.
JustCarty

46

구문을 사용하려면 -r옵션 ( "스크립트에서 확장 정규식 사용") sed을 사용하십시오 {n}.

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

1
문자열에서 마지막 X 문자를 제거하려면 어떻게해야합니까?
Kokesh

5
@Kokesh : sed -r 's/.{5}$//'대신 마지막 5자를 제거 할 수 있습니다
Mark Longair

7
중괄호를 이스케이프 하면 -r( -EOS X, IIRC에서) 없이 수행 할 수 있습니다 ( OS X에서 작동하는지 모르겠습니다).
추후 공지가있을 때까지 일시 중지되었습니다.

2
@Dennis는 : - (오프 떠나는 괄호를 탈출 난 그냥 확인 -r/ -E) OS X에서 작동
고든 데이비슨에게

15

문자열에서 처음 두 문자를 자릅니다.

$ string="1234567890"; echo "${string:2}"
34567890

@ dtp70 일반적인 답변 감사합니다.
wolfram77

10

파이프를 통해 awk '{print substr($0,42)}'어디 42 드롭 문자의 수보다 하나 더 많은 것이다. 예를 들면 다음과 같습니다.

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

8

기회도있을 cut것입니다. 그렇다면:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

1
문제 cut는 공백 tr -s ' '을 "짜내는" 방법 을 사용하여 공백을 더 잘 처리 할 수 ​​있다는 점 입니다.
Thor

1
모든 노래를 춤추는 도구가되는 것은 아닙니다. 그것은 간단하고 캔에 명시된대로 광범위하게 사용할 수 있습니다. 위의 요구 사항에 대해서는 잘 작동하고 특정 위치에서 고정 문자를 자르는 것이 확실히 더 강력합니다.
Shawn Chin

5

여기 sedawk, cutbash구문을 사용하는 솔루션이 있습니다 . 다른 POSIX 준수 변형을 던지고 싶습니다.

$ echo "pid: 1234" | tail -c +6
1234

-c입력 데이터의 끝부터 시작하여 시작될 바이트 오프셋을 꼬리에 알려주지 만, 숫자가 +부호로 시작하면 입력 데이터의 시작부터 끝까지입니다.


4

cut대신에를 사용 하는 다른 방법 입니다 sed.

result=`echo $pid | cut -c 5-`

그는 처음 4자를 제거하려고합니다. 처음 4자를 얻습니다.
MM.

2

나는 이 질문 에 의해 제공된 순수한 sed에서 답을 찾았습니다 (물론이 질문이 게시 된 후에 게시되었습니다). 이것은 sed에서만 요청한 내용을 정확하게 수행합니다.

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

)의 점 sed '/./은 원하는 항목입니다. 귀하의 질문은 정확히 내가 시도한 것입니다. 제 경우에는 파일의 특정 줄을 일치시키고 주석 처리를 제거하려고했습니다. 제 경우에는 다음과 같습니다.

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

-ised 편집 할 수있는 장소에있는 파일 (당신이 전에 파일을 편집에 일치 식을 테스트 할 경우이 스위치를 제거)입니다.

(이 질문에 따라 sed로 완전히 수행하고 싶었 기 때문에이 게시물을 게시했지만 이전 답변 중 어느 것도 그 문제를 해결하지 못했습니다.)


1

처음부터 n 문자를 제거하는 대신 숫자를 직접 추출 할 수 있습니다. 이렇게 ...

$ echo "pid: 1234" | grep -Po "\d+"

이것은보다 강력한 솔루션 일 수 있으며보다 직관적 인 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.