GNU sed: 이름 시작 전과 이름 끝 뒤에 추가(출력: "$ls -xN")

GNU sed: 이름 시작 전과 이름 끝 뒤에 추가(출력: "$ls -xN")

누군가 내 GNU sed스크립트가 이 작업을 수행하는 좋은 방법인지 또는 일종의 나쁜/잘못된 해킹인지 확인해 줄 수 있습니까? p

$ ls -xN
1
2
3
4
$ ls -xN | sed -E "s/(.{1})$/\1\.log/" | sed -E "s/^(.{1})/Day\ \1/"
Day 1.log
Day 2.log
Day 3.log
Day 4.log

sed왜 모르는지 이해가 안 돼요 \n(새로운 팀) 그리고 \s(공백):

  • 새로운 팀:
    • 을(를) 사용하고 싶지만 사용해야 \n합니다..{1}$
  • 공간:
    • 을(를) 사용하고 싶지만 사용해야 \s합니다.\

답변1

GNU sed인식 \n\s. 그러나 \s최소한 공백, 개행(일명 개행), 탭, 폼 피드, 수직 탭 및 캐리지 리턴과 일치하는 "모든 공백 문자"를 의미하지만 로케일에는 더 많은 것이 있을 수 있습니다. 표준 문자 클래스와 동일합니다 [[:space:]]. 한 글자가 아닌 여러 글자이기 때문에 모호하고 sed무엇을 삽입하려는지 알 수 없기 때문에 대체 연산자의 오른쪽에 사용할 수 없습니다 . 하지만 왼쪽에서는 잘 작동합니다.

$ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n'
[FF]ce]: [tab]: [CR]:

$ printf '[space]: [tab]:\t[CR]:\r[FF]\f\n' | sed 's/\s/MATCH/g'
[space]:MATCH[tab]:MATCH[CR]:MATCH[FF]MATCH
$

또는 이스케이프 처리하지 않고 간단한 공백을 사용할 수 있습니다.

$ printf '%s\n' {1..4} | sed -E 's/^(.{1})/Day \1/'
Day 1
Day 2
Day 3
Day 4

다음으로, GNU는 sed개행 문자를 잘 인식합니다. 여기서는 그것이 어떻게 관련되는지 이해가 되지 않습니다. $"라인의 끝 부분과 일치"를 의미합니다 . \n필요한 경우 로 교체할 수 있습니다. 예를 들어:

$ printf '%s\n' {1..4} | sed -zE 's/(.)\n/\1.log\n/g'
1.log
2.log
3.log
4.log

귀하의 질문에 있는 사용자 사례와 관련이 없는 것 같습니다. 마지막으로, 한 번의 작업으로 모든 작업을 수행할 수 있습니다.

$ printf '%s\n' {1..4} | sed -E 's/(.)/Day \1.log/'
Day 1.log
Day 2.log
Day 3.log
Day 4.log

마지막 포인트는거의 좋은 생각이 아니다ls약간 이상한 파일 이름이 있어도 as의 출력을 구문 분석하면 중단됩니다. 언급한 특정 사례와는 관련이 없지만 일반적으로 사용을 피해야 합니다.

관련 정보