Sed: 특정 한 자리/두 자리 숫자 바꾸기

Sed: 특정 한 자리/두 자리 숫자 바꾸기

내 테이블에 데이터가 있습니다. 열에서 일부 인덱스(1~23의 숫자)를 3~4자리 샘플 번호(예: 2347,3856 등)로 바꿔야 합니다.

따라서 원래 열은 다음과 같습니다.

SF=1,2
SF=12,7
SF=17,4

출력은 다음과 같아야 합니다.

SF=2347,3856
SF=8553,9539
...

문제는: 하나의 샘플(1->2720)에 대해 이 작업을 수행하면 괜찮지만 2를 다른 것으로 바꾸면 혼란이 발생하고 숫자를 바꾸도록 지정하는 방법을 모르겠습니다. 그냥 (2) 숫자인가요? 2개 이상의 연속된 숫자가 있을 수 있습니다.

혼란스럽게 들렸다면 죄송합니다. 나는 초보자입니다.

고쳐 쓰다. 감사합니다매직나는 부분적으로 성공했습니다. 그러나 어떤 이유로 행의 첫 번째 교체 후에 새 행이 생성되고 다음 숫자는 분명히 교체되지 않습니다. 그래서 내가 얻는 것은 다음과 같습니다.

SF=2347

,2

SF=8553

,7

코드는 다음과 같습니다.

'sed "s/=${index},/=${sample},/g; s/,${index} /,${sample} /g; s/,${index},/,${sample },/g" 샘플.txt'

왜 이런 일이 발생합니까?

답변1

생각하다, 다음과 같은 작업을 수행하려고 합니다.

$ sed 's/=1,/=2347,/g; s/=12,/=3856,/g' sedtest.txt
SF=2347,2
SF=3856,15
SF=17,4

패턴 및 대체 문자열에 리터럴 "=" 및 ","를 포함하면 "=1"과 "=12"를 구별할 수 있습니다.


고쳐 쓰다:

바꾸다둘 다sed의 변수는 $를 사용하여 줄 끝을 일치시킬 수 있습니다.

$ sed 's/=1,/=2347,/g; s/=12,/=3856,/g; s/,2$/,2342/g; s/,15$/,234325/g' sedtest.txt
SF=2347,2342
SF=3856,234325
SF=17,4

${var}와 같은 bash 변수를 혼합하면 이상해 보이지만 큰따옴표를 사용하면 작동합니다.

예를 들어,

$ a=42
$ sed "s/=1,/=2347,/g; s/=12,/=${a},/g; s/,2$/,2342/g; s/,15$/,234325/g" sedtest.txt
SF=2347,2342
SF=42,234325
SF=17,4

그런데 대체 항목이 큰 경우 sed의 파일을 사용하여 모두 정리할 수 있습니다. 예를 들어,

$ cat ./datascript.sed 
# Sed script to do stuff
s/=1,/=2347,/g
s/=12,/=2342,/g
s/,2$/,2342/g
s/,15$/,234325/g

그런 다음 데이터에 대해 파일을 실행하십시오.

$ sed -f datascript.sed sedtest.txt
SF=2347,2342
SF=2342,234325
SF=17,4

이 파일의 단점은 변수를 사용하는 방법을 모른다는 것입니다.

관련 정보