20

このようなものを変換する方法はありますか?

MyDirectoryFileLine

my-directory-file-line

すべての文字を大文字または小文字に変換する方法をいくつか見つけましたが、その方法ではありません。何か案は?

4

9 に答える 9

27

を使用s/\([A-Z]\)/-\L\1/gして大文字を検索し、ダッシュと小文字に置き換えることができます。ただし、これにより行の先頭にダッシュが表示されるため、これを処理するには別のsed式が必要です。

これは機能するはずです:

sed --expression 's/\([A-Z]\)/-\L\1/g' \
    --expression 's/^-//'              \
    <<< "MyDirectoryFileLine"
于 2011-12-14T10:43:01.627 に答える
13

私はそれを行うためにsedを使用することを提案します:

NEW=$(echo MyDirectoryFileLine        \
     | sed 's/\(.\)\([A-Z]\)/\1-\2/g' \
     | tr '[:upper:]' '[:lower:]')

UPD小文字の更新されたコードに変換するのを忘れています

于 2011-12-14T10:38:33.853 に答える
8
echo MyDirectoryFileLine | perl -ne 'print lc(join("-", split(/(?=[A-Z])/)))'

プリントmy-directory-file-line

于 2011-12-14T10:39:24.950 に答える
3

いくつかのより可能性のあるエッジケースをカバーする@bilalqの答えのわずかなバリエーション:

echo "MyDirectoryMVPFileLine"                          \
| sed 's/\([^A-Z]\)\([A-Z0-9]\)/\1-\2/g'               \
| sed 's/\([A-Z0-9]\)\([A-Z0-9]\)\([^A-Z]\)/\1-\2\3/g' \
| tr '[:upper:]' '[:lower:]'

出力はまだです:

my-directory-mvp-file-line

だけでなく:

WhatADeal -> what-a-deal
TheMVP -> the-mvp
DoSomeABTesting -> do-some-ab-testing
The3rdThing -> the-3rd-thing
The3Things -> the-3-things
ThingNumber3 -> thing-number-3
于 2019-05-10T15:38:58.657 に答える
1

ここに投稿された解決策はどれも私にはうまくいきませんでした。ほとんどが複数のプラットフォームをうまくサポートしていませんでした。@ 4ndrewのものは近いものでしたが、複数の大文字の文字が隣り合っているエッジケースでは失敗しました(例:の代わりににFooMVPClientなります)。foo-mv-pclientfoo-mvp-client

これは私のために働いた:

echo "MyDirectoryMVPFileLine"              \
| sed 's/\([a-z]\)\([A-Z]\)/\1-\2/g'       \
| sed 's/\([A-Z]\{2,\}\)\([A-Z]\)/\1-\2/g' \
| tr '[:upper:]' '[:lower:]'

出力:

my-directory-mvp-file-line
于 2018-03-20T00:29:26.180 に答える
1

「/」(ディレクトリ名またはgithubリポジトリ名に使用される可能性があります)で機能する私の控えめな貢献。それはそれができるほどきれいではありませんが、仕事をします。@Peterの貢献をベースとして使用し、少し調整しました。

function kebab_case() {
  echo -n "$1" |\
  sed 's/\([^A-Z+]\)\([A-Z0-9]\)/\1-\2/g' |\
  sed 's/\([0-9]\)\([A-Z]\)/\1-\2/g' |\
  sed 's/\([A-Z]\)\([0-9]\)/\1-\2/g' |\
  sed 's/--/-/g' |\
  sed 's/\([\/]\)-/\1/g' |\
  tr '[:upper:]' '[:lower:]'
}

function assert_kebab_equal() {
    local Actual
    local Expected
    Expected="$1"
    Actual="$(kebab_case "$2")"

    if [ "${Expected}" != "${Actual}" ]; then
      echo Error:
      echo "  Actual: ${Actual}"
      echo "Expected: ${Expected}"
    else
      echo "$2" "$1" | awk '{ printf "%-30s -> %-40s\n", $1, $2}'
    fi
}

assert_kebab_equal "abc-def" "AbcDef"
assert_kebab_equal "/abc-def-ghi/def" "/AbcDef-Ghi/Def"
assert_kebab_equal "/ab-cd-ef" "/AbCdEf"
assert_kebab_equal "repo-owner/repo-name" "RepoOwner/RepoName"
assert_kebab_equal "repo-12-owner/repo-12-name" "Repo12Owner/Repo12Name"
assert_kebab_equal "repo-12-3-owner/repo-12-name" "Repo12-3Owner/Repo12Name"
assert_kebab_equal "repo-owner/repo-name" "REPO-OWNER/REPO-NAME"
assert_kebab_equal "repo-owner-2/repo-name" "REPO-OWNER2/REPO-NAME"
assert_kebab_equal "repo-1-owner" "REPO1-OWNER"
assert_kebab_equal "repo-1-owner-1/22-repo-2-name" "REPO1-OWNER1/22REPO-2NAME"


# Outputs:

AbcDef                         -> abc-def                                 
/AbcDef-Ghi/Def                -> /abc-def-ghi/def                        
/AbCdEf                        -> /ab-cd-ef                               
RepoOwner/RepoName             -> repo-owner/repo-name                    
Repo12Owner/Repo12Name         -> repo-12-owner/repo-12-name              
Repo12-3Owner/Repo12Name       -> repo-12-3-owner/repo-12-name            
REPO-OWNER/REPO-NAME           -> repo-owner/repo-name                    
REPO-OWNER2/REPO-NAME          -> repo-owner-2/repo-name                  
REPO1-OWNER                    -> repo-1-owner                            
REPO1-OWNER1/22REPO-2NAME      -> repo-1-owner-1/22-repo-2-name         

于 2021-04-18T14:15:12.597 に答える
0

GNU sedの場合:

echo "MyDirectoryFileLine"|sed -e 's/\([A-Z]\)/-\L\1/g'

気になる場合は、最初のダッシュを削除する必要があります。

echo "MyDirectoryFileLine"|sed -e 's/\([A-Z]\)/-\L\1/g' -e 's/^-//'

BSD sedを使用すると、少し長くなります。

echo "MyDirectoryFileLine"|sed -e 's/\([A-Z]\)/-\1/g' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' -e 's/^-//'

更新:BSDバージョンはGNUバージョンで動作するので、後者を使用することをお勧めします。

于 2011-12-14T10:43:21.067 に答える
0

これはあなたのために働くかもしれません:

<<<"MyDirectoryFileLine" sed 's/[A-Z]/-\l&/g;s/.//'
my-directory-file-line
于 2011-12-14T10:47:35.483 に答える
0
echo "SomeACRONYMInCamelCaseString" \
 | sed -e 's/\([a-z]\)\([A-Z]\)/\1-\L\2/' \
 | sed -e 's/\(.*\)/\L\1/')

sed -e 's/\([a-z]\)\([A-Z]\)/\1-\L\2/'大文字の前に小文字がある場合にのみ、大文字をハイフンと小文字に置き換えます。 sed -e 's/\(.*\)/\L\1/'文字列全体を小文字にします

于 2020-08-11T00:56:35.737 に答える