파일 시작 부분에 문자열 추가

파일 시작 부분에 문자열 추가
$ ls *
2000-01-01-abcd.md
2000-01-01-cdef.md

다음 명령에서 abcd 및 cdef를 추출할 수 있습니다.

 find *.md -exec sh -c "echo {} | sed 's/.md//' | sed 's/2000-01-01-//'" \;

파일 시작 부분에 문자열을 추가하여 이를 수행하는 방법을 알고 있지만 sed '1s/^/string/'정확한 문자열을 전달하는 방법은 무엇입니까?

각 파일의 시작 부분에 해당 문자열을 추가하고 싶기 때문에 이 문자열 "abcd" 및 "cdef"를 해당 파일에 어떻게 전달할 수 있습니까?

답변1

각 파일의 시작 부분에 해당 문자열을 추가하십시오.

세게 때리다+sed방법:

for f in *.md; do fn=${f##*-}; sed -i "1 s/^/${fn%.*} /" "$f"; done

  • fn=${f##*-}- 가장 긴 일치 시퀀스를 왼쪽부터 마지막 ​​항목까지 자릅니다 -(예 abcd.md: ).

  • ${fn%.*}.- 이전 하위 문자열 fn(예: )이 abcd처음으로 나타날 때까지 가장 오른쪽 시퀀스(끝부터 시작)를 자릅니다.

  • sed -i "1 s/^/${fn%.*} /" "$f"- 파일 시작 부분에 원하는 문자열을 추가합니다.

답변2

나는 이것이 내가 찾고 있던 것에 가장 가깝다는 것을 알았습니다. tmp 버퍼의 아이디어는 이러한 목적을 해결합니다. 다른 솔루션에서는 for 루프를 제안하고 있으며 제 생각에는 find -exec 조합이 이미 이 문제를 해결했습니다.

https://unix.stackexchange.com/a/197400/119007

find ./ -name '*.md' -exec sh -c "echo '{}' | sed 's/.md//' | sed 's/2000-01-01-//' > tmp && cat {} >> tmp && mv tmp {}" \;

답변3

*.md명령에서 이를 인용 해야 합니다 find. 그렇지 않으면 런타임 시 일치하는 이름으로 확장됩니다. 또한 {}인용문의 맥락에서 사용해서는 안 됩니다 (예:"find -exec sh -c"를 사용해도 안전합니까?).

쉘 루프 솔루션은 다음과 같습니다.

for name in ./*.md; do
    prefix="${name%.md}"             # "./2000-01-01-abcd.md" --> "./2000-01-01-abcd"
    prefix="${prefix##*-}"           # "./2000-01-01-abcd"    --> "abcd"

    { echo "$prefix"; cat "$name"; } >"$name".tmp && mv "$name".tmp "$name"
done

똑같은 것 find:

find . -type f -maxdepth 1 -name "*.md" \
    -exec sh -c 'p="${1%.md}";p="${p##*-}";{ echo "$p";cat "$1"; }>"$1".tmp && mv "$1".tmp "$1"' sh {} ';'

관련 정보