어떤 프로그램을 쓰면 좋을까요? ; 1줄을 2개씩 붙이는 방법? ;


1줄 에서 글자를 32개 뽑아내는 방법?

택스트 파일에 있는 내용에서 1줄씩 글자를 32개 뽑아낼려면 어떤 프로그램을 쓰면 좋을까요?
[글자가 부족하면 공백으로 채워야 합니다. 추가적으로 공백을 6개 맨끝에 추가하는 방법도요.]


1줄을 2개씩 붙이는 방법?

택스트 파일에 있는 1줄을 2개씩 붙일려면 어떤 프로그램을 쓰면 좋을까요?


[quote="mms64sk":2x41ik77]- - -
1줄 에서 글자를 32개 뽑아내는 방법?

택스트 파일에 있는 내용에서 1줄씩 글자를 32개 뽑아낼려면 어떤 프로그램을 쓰면 좋을까요?
[글자가 부족하면 공백으로 채워야 합니다. 추가적으로 공백을 6개 맨끝에 추가하는 방법도요.]


1줄을 2개씩 붙이는 방법?

택스트 파일에 있는 1줄을 2개씩 붙일려면 어떤 프로그램을 쓰면 좋을까요?

    • -[/quote:2x41ik77]

첫번째 질문은 정확히 이해를 못하겠네요.
텍스트파일에 줄바꿈이 있을 경우는? (나머지 공간을 공백으로 채운다?)
글자가 32개를 넘는 경우는? (자른다, 다음 줄로 넘긴다, 생략표시를 붙인다 등)
추가 공백 6개를 붙인다는게 어떤 식인지?

두번째 질문도 역시 약간 애매

복사라면. sed로 간단
sed -i ‘p’ a.txt

두줄을 한줄로 합치는 거라면,
sed -in ‘N;s/\n//;p’ a.txt

예를들어 택스트 파일에서
1번째 줄을 추출한 줄에서 처음부터 32번째 글짜까지 추출한 다음에 [
32글자가 이상 넘어가면 나머지 내용은 잘라냅니다.
32글자보다 적으면 나머지 부족한 부분은 공백으로 채웁니다. 줄바꿈 글자는 공백으로 대체합니다.
]
공백 6글자를 맨 마지막에 덧붙힌후 또다른 파일로 저장 하는걸 원합니다. [나머지 {2,3,4, …}줄도 반복.]


예를들어 택스트 파일에서 {
1번째와 2번째를 합친후에 다른 파일에 1번째 줄로 출력.
3번째와 4번째를 합친후에 다른 파일에 2번째 줄로 출력.
}
이런식이요.


32문자까지 잘라내는 명령

[code:1sntej6m]sed -i 's/^(.{,32}).*$/\1/g;:a;/.{32}/!{s/$/ /;ba};$a\ ’ sample.txt
[/code:1sntej6m]

줄을 합치는 명령

[code:1sntej6m]sed -i ‘N;s/\n//g’ sample.txt[/code:1sntej6m]

줄을 합치는 명령 (공백을 구분자로 합치기)

[code:1sntej6m]sed -i ‘N;s/\n/공백/g’ sample.txt[/code:1sntej6m]

32글자가 이상 넘어가면 나머지 내용은 잘라냅니다.
==> sed ‘s/^(.{,32}).*$/\1/g’

32글자보다 적으면 나머지 부족한 부분은 공백으로 채웁니다.
==> sed ‘:a;/.{32}/!{s/$/ /;ba}’
==> 혹은, sed ‘s/$/\공백32자/;s/^(.{32}).*$/\1/g’
이 방식은 반복문을 사용하지 않기 때문에 속도가 빠릅니다.
공백32자를 덧붙인 후, 32자 까지 잘라냅니다.

줄바꿈 글자는 공백으로 대체합니다.
==> 줄단위로 처리하는데 줄바꿈을 공백으로 대체한다니 어떤 의미일까요?
아예 모든 줄을 한줄로 합친다는 의미입니까?

공백 6글자를 맨 마지막에 덧붙힌후 또다른 파일로 저장 하는걸 원합니다
==> 맨마지막줄에 공백6글자가 들어있는 줄을 추가하는 건가요?
그렇다면,
==>sed ‘$a\공백6자’
만일 매줄마다 공백6글자를 끝에 추가하는 거라면 총 38자가 되겠네요
==>sed ‘s/$/공백6자/’

ㅋㅋㅋ HTML은 여러개의 공백을 하나로 보여주기 때문에, [code]를 사용하지 않으면 제대로 보이질 않죠.

1번째와 2번째를 합친후에 다른 파일에 1번째 줄로 출력.
3번째와 4번째를 합친후에 다른 파일에 2번째 줄로 출력.
==> sed ‘N;s/\n//g’

** 위의 예문에서 사용한 sed 명령 설명 **
-i 옵션은 입력파일을 수정하는 옵션입니다.

sed는 여러 명령을 ;(semicolon)으로 분리합니다.
그러니 앞의 정규표현식을 합칠 수 있습니다.
{} 하나의 조건에 대해 여러 명령을 줄 때 사용합니다.
sed의 처음 문자는 명령이거나 주소인데, $는 마지막줄을 의미합니다.
/정규표현식/은 해당 정규표현식에 맞는 줄에 대해 처리를 하고,
/정규표현식/!는 맞지않을 경우에 대해 처리합니다.
/정규표현식1/,/정규표현식2/는 정규표현식1에 해당하는 줄에서 시작해서,
정규표현식2에 해당하는 줄까지의 범위를 대상으로 매줄마다 처리합니다.
s는 치환명령입니다.
a는 문자열을 추가하는 명령입니다.
N 명령은 다음줄까지 읽어내어 버퍼에 담습니다. 하나의 문자열로 처리되죠
:문자 는 label로 위치를 기억하고, b는 해당 위치문자로 점프합니다. 반복문처리가 됩니다.

** 위의 예문에서 사용한 정규표현식 설명 **
^ 문자열을 시작위치
$ 문자열의 끝위치
. 모든문자

  • 0번이상 일치
    + 1번이상 일치
    (정규표현식) 정규표현식에 해당하는 내용을 변수에 담습니다. 이것을 back-reference라고 하며 \번호 로 변수의 내용을 참조할 수 있습니다.
    번호는 (가 나타난 순서에 따라 1번부터 할당됩니다.
    {최소,최대} 몇번 일치하는지 지정,
    u{3,5} uuu,uuuu,uuuuu가 해당됨
    u{3} uuu만 해당됨
    u{3,} u가 3번이상나오면 해당됨
    u{,3} u,uu,uuu가 해당됨

예제중 {
1번째와 2번째를 합친후에 다른 파일에 1번째 줄로 출력.
3번째와 4번째를 합친후에 다른 파일에 2번째 줄로 출력.
==> sed ‘N;s/\n//g’
}
부분에서 '\n’의 n의 숫자는 어떻게 되나요?
["리눅스 실전가이드"읽으면서 분석하고 있읍니다.]

[quote="mms64sk":3ehlblou]예제중 {
1번째와 2번째를 합친후에 다른 파일에 1번째 줄로 출력.
3번째와 4번째를 합친후에 다른 파일에 2번째 줄로 출력.
==> sed ‘N;s/\n//g’
}
부분에서 '\n’의 n의 숫자는 어떻게 되나요?[/quote:3ehlblou]
\n은 줄바꿈입니다.

고맙습니다.

[quote="mms64sk":1i3itxlh]예제중 {
1번째와 2번째를 합친후에 다른 파일에 1번째 줄로 출력.
3번째와 4번째를 합친후에 다른 파일에 2번째 줄로 출력.
==> sed ‘N;s/\n//g’
}
부분에서 '\n’의 n의 숫자는 어떻게 되나요?
["리눅스 실전가이드"읽으면서 분석하고 있읍니다.][/quote:1i3itxlh]

문자열에 (백슬래시)로 시작하면 이스케이프문자라고 불리며, 특수한 문자를 처리하기 위한 것입니다.
\n 줄바꿈(newline)
\r carrange-return (이동된 타자기 헤드를 다시 앞으로 옮기는 것에서 유래된 것으로 커서를 그줄의 첫위치로 옮기는 것으로 행은 그대로 두고 열만 처음으로)
원래 \n은 lf(line-feed)로 타자기옆의 손잡이로 종이를 말아올리는 것으로 커서를 다음줄로 옮기는 것으로 열은 그대로 두고 행만 증가
윈도우즈에서는 \r\n이 하나의 줄바꿈이고, 유닉스계열에서는 \n하나만 사용됨
이 때문에, 윈도우즈에서 노트패트로 작업한 문서를 유닉스계열의 vi에서 읽어 들이면 ^M이 붙어서 보이죠.
\t는 탭문자
\b는 백스페이스
\a는 비프음(삑소리) 등이 있고,
\는 백슬래시 문자자체를 나타냅니다

\번호 라고 적은것에서 \n에 숫자가 들어갈 것이라 생각하신 듯 합니다.
\번호 는 백레퍼런스(후위참조)로 변수라고 생각하시면 됩니다.
(정규표현식)이 변수를 만드는 것이고, \번호 는 그 변수의 값을 가리킵니다.
echo abacd| sed ‘s/(a)b\1/yy/’
==> yycd

후위참조를 지원하지 않는 awk에서 \번호는 이스케이프문자로 해석될 수 있습니다.
\팔진수 로 말이지요.
\번호 의 후위참조에서 주의하실 것은, 1-9까지 가능하다는 것입니다.
정규표현식은 문자단위이기 때문에, \10 이것을 10번째 변수인지, \1의 첫번째 변수에 0문자가 붙어 있는지는 구분을 못하기 때문에,
1-9까지 가능한 것입니다.

{"yycd" -> "yyacd"}아닌가요?

[quote="mms64sk":22gkai5z]{"yycd" -> "yyacd"}아닌가요?[/quote:22gkai5z]
echo abacd| sed ‘s/(a)b\1/yy/’
==> yycd

이게 맞습니다.
(a)에서 a가 일치하고 이것이 변수 \1에 할당됩니다.
이후 b\1에서 ba가 되어서
정규표현식의 검정식은 aba가 됩니다.
고로 abacd 에서 (a)b\1과 일치한 aba가 yy로 치환되어
yycd가 되는 것입니다.

알겠습니다.