группы фиксации в sed

Отредактировано один раз - из-за комментария fede s.

Добро пожаловать на SO.

Отказ от ответственности : Я использую ветку Smalltalk / X-jv, которая отличается от smalltalk от gnu-smalltalk, поэтому я не эксперт по gnu-smalltalk.

1145 Я укажу вам на некоторые недостатки, которые я обнаружил. Слишком много, чтобы указывать. Я дам вам несколько общих идей.

  1. Я обычно не рекомендую использовать a, b, c ... z в качестве переменных. Если вы вернетесь к коду через некоторое время, вы его не поймете.

  2. Для переменных используйте строчные буквы, такие как content вместо Content. Первая заглавная буква зарезервирована для глобальных переменных. В вашем случае использования это будет имя класса (не смешивайте его).

  3. Если вы хотите создать новый экземпляр, используйте его следующим образом: aCard := Card new.

  4. Не создавайте всю логику приложения в вашем методе #init (initialize) ! Вы должны разбивать свой код небольшими читаемыми методами.

Ваш init должен выглядеть следующим образом:

  Deck extend [
      init [
          
          content := Array new: 52.
          Transcript show: 'Initializing Deck...'.
      ]
  ]

, который создаст метод #init с переменной экземпляра content. Не забудьте создать методы доступа к переменной. Прочтите руководство для gnu-smalltalk и создания методов экземпляра.

  1. У вас должны быть комментарии к петлям whileTrue:. Зачем кому-то угадывать причину ограничений?

     [a <= 4] whileTrue:[
           b := 1 . 
           [b <= 13] whileTrue:[
     ...
    
  2. Иметь веские основания для переопределения new сообщения. Сообщение Transcript может быть ini init:

    Deck class >> new [
         
         | r |
         r := self new . 
         Transcript show: 'start  '.
         r init .
         ^r
    ] 
    

Почему вы переопределяете новое? Если у вас есть объект, который является Object subclass:, то он уже понимает сообщение new.

В нижней части кода у вас есть z := Deck new. (я рекомендую использовать, например, myDeck := Deck new.). Если вы хотите запустить инициализацию, вы просто выполните myDeck init.

  1. Почему вы в Card >> init возвращаете ^super init? Может быть, вы хотели сделать первую строку super init (чтение \ загрузка инициализации суперкласса), а затем вернуть ^ self? Трудно сказать.

  2. Suit := Club . Что это значит? Вы создаете как-то новый объект? (отсутствует сообщение #new). Ты пытаешься задеть ниточку? Это должно быть suit := 'Club'. тогда. (то же самое касается всех Sunit переменных).

Еще бы просто читать с хрустального шара. Попробуйте прочитать больше о Smalltalk, и я надеюсь, что мои советы помогут вам в дороге.

23
задан djechlin 13 January 2014 в 19:09
поделиться

4 ответа

sed выводит свой ввод, потому что подстановка не совпадает. Поскольку вы, вероятно, используете GNU sed, попробуйте следующее:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
  • \ d -> [0-9], поскольку GNU sed не распознает \ d
  • {} -> \ {\}, поскольку GNU sed по умолчанию использует базовые регулярные выражения.
21
ответ дан 29 November 2019 в 02:16
поделиться

Это должно сработать. Вы также можете пропустить последнюю группу и просто использовать вместо нее \ 1 , но, поскольку вы изучаете sed и regex, это хороший материал. Я хотел использовать группу без захвата посередине (:?) , но я не мог заставить ее поиграть с sed по какой-то причине, возможно, она не поддерживается.

sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result

И, конечно, вы можете использовать

sed --posix 's/ko://'
10
ответ дан 29 November 2019 в 02:16
поделиться

Для этого вам не нужен sed

Вот как это можно сделать с помощью bash:

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}

${var//"ko:"} заменяет все "ko:" на ""

Смотрите Манипулирование строками для получения дополнительной информации

6
ответ дан 29 November 2019 в 02:16
поделиться

@ ОП, если вы просто хотите избавиться от «ko:», тогда

$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA

$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA

Просто примечание. Хотя вы можете использовать чистую подстановку строк в bash, она более эффективна только тогда, когда вы изменяете одну строку. Если у вас есть файл, особенно большой, использование цикла while read в bash по-прежнему медленнее, чем использование sed или awk.

0
ответ дан 29 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: