sed를 사용한 사용자 정의 문자열 공간 조작


6

다음 명령 :

head -n 1 $FILE | tail -n 1

1 행의 텍스트를 가져옵니다. $FILE. 각 행의 형식은 다음과 같습니다. $FILE 다음과 같다:

1 2 3 4  2 3  3 4 5  4 5 6 7 8 9

보시다시피, 각 문자는 하나의 공백으로 구분됩니다. 각 그룹은 두 개의 공백으로 구분됩니다. 사용 sed 단일 공백을 제거하고 공백으로 변환해야합니다.

에있는 텍스트 $FILE 다른 for 루프 안에 중첩 된 for 루프에 의해 생성됩니다. 각 줄의 텍스트 데이터가 리디렉션됩니다. >>$FILE 중첩 된 후 메인 루프에서 그것의 과정을 실행합니다. 텍스트 문자열의 각 문자 / 숫자는 중첩 된 for 루프가 한 번 완료 한 결과입니다. 그런 다음 main for 루프는 중첩 for 루프의 출력을 $FILE.

따라서 의사 코드의 예는 다음과 같습니다.

for i in $(seq 1 $RANDOM)
do
    for n in {1..10}
    do
        $do_something
    done

$do_something_else
done >> $FILE

head -n 1 $FILE | tail -n 1 | (sed command here)

위의 코드가 어떻게 구조화되어 있는지는 여기에 필요하지 않습니다. 간단히 말해 위에서 설명 된 텍스트 조작에 대한 간단한 방법을 찾으려합니다. 이게 전에 물었다면, 사과드립니다. 내 검색어에서 찾을 수 없었습니다.


사용하지 않아도됩니다. tail 이후 head 어쨌든 한 줄만주고 있습니다.
Dennis Williamson

내 스크립트에서 필요한 것을 결정합니다. 꼬리를 사용하는 것은 원하지 않는 활동을 방지하기위한 안전 장치 일뿐입니다. 내가 사용하는 방식으로 head "1"은 실제로 또 다른 for 루프 안에 있으며 행 번호는 $ i에 의해 결정됩니다. 질문의 코드는 의사 코드이며 그 이상의 것은 아닙니다.
Yokai

답변:


6

이것은 작동해야합니다 :

sed 's/ \([^ ]\)/\1/g'

스크립트의 마지막 줄 전체를 다음과 같이 바꿀 수도 있습니다 :

sed -n '1s/ \([^ ]\)/\1/gp' "$FILE"

@ 요괴, 당신은 머리와 꼬리 명령이 필요하지 않습니다, 업데이 트를 참조하십시오
perreal

$ FILE에서 줄을 끌어 오는 방법은 내 개인적인 선호입니다.
Yokai

3

이것은 어떤가요:

$ head -n1 $FILE | tail -n 1 | sed 's,  ,|,g' | sed 's, ,,g' | sed 's,|, ,g'
1234 23 345 456789

먼저 공백 문자를 공백 문자로 대체합니다. | 단일 공백과 구별하기 위해 모든 공백을 제거하고 마지막으로 공백을 | 하나의 공백으로


재미있는 파이핑이 sed에 두 번 더 들어갔다. 그러나 이것은 내가 물었던 것을 정확히 수행합니다. 아주 좋은 직장!
Yokai

한 번의 호출로 모든 작업을 수행 할 수 있어야합니다. 초기 및 최종 작은 따옴표를 유지하고 bash 파이프와 "sed"(더미 문자로 사용하지 않은 것)를 개행 문자로 바꾸십시오. 이것으로 세 줄짜리 세 줄 프로그램이됩니다. 코멘트에 그것을 보여줄 방법이 없습니다.
Joe

2

교체 작업은 단일 작업으로 수행 할 수 있습니다. s 명령 sed에서 :

s/ \( \?\)/\1/g

첫 번째 줄 다음에 끝내려면 q 그걸 하나로 묶어 라.

sed -e 's/ \( \?\)/\1/g' -e '1q'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.