Бит awk должен сделать это?
awk '{s+=$1} END {print s}' mydatafile
Примечание: некоторые версии awk имеют некоторые нечетные поведения, если Вы собираетесь быть добавлением чего-нибудь превышение 2^31 (2147483647). См. комментарии для большего количества фона. Одно предложение должно использовать printf
, а не print
:
awk '{s+=$1} END {printf "%.0f", s}' mydatafile
Попробуйте использовать вместо него String.replace ()
или String.replaceAll ()
.
String my_new_str = my_str.replace("&", "&");
(Оба заменяют все вхождения; replaceAll
позволяет использовать регулярное выражение.)
Простой ответ:
token = token.replace("&", "&");
Несмотря на название по сравнению с replaceAll, replace действительно выполняет replaceAll, он просто не использует регулярное выражение, которое, похоже, здесь в порядке ( как с точки зрения производительности, так и с точки зрения хорошей практики - не используйте регулярные выражения случайно, поскольку у них есть особые требования к символам, на которые вы не будете обращать внимания).
Ответ Шона Брайта, вероятно, настолько хорош, что стоит подумать с точки зрения производительности при отсутствии каких-либо дополнительных целевых требований к производительности и тестированию производительности, если вы уже знаете, что этот код является горячей точкой для производительности, если ваш вопрос исходит именно от этого. Это, конечно, не заслуживает отрицательных оценок. Просто используйте StringBuilder вместо StringBuffer, если вам не нужна синхронизация.
При этом, здесь есть несколько более глубокая потенциальная проблема. Экранирование символов - известная проблема, которую решают многие библиотеки. Возможно, вы захотите обернуть данные в разделе CDATA в XML, или вы можете предпочесть использовать библиотеку XML (в том числе ту, которая сейчас поставляется с JDK), чтобы действительно правильно сгенерировать XML (чтобы он обрабатывал кодировку
Apache также имеет библиотеку экранирования как часть Commons Lang.
StringBuilder s = new StringBuilder(token.length());
CharacterIterator it = new StringCharacterIterator(token);
for (char ch = it.first(); ch != CharacterIterator.DONE; ch = it.next()) {
switch (ch) {
case '&':
s.append("&");
break;
case '<':
s.append("<");
break;
case '>':
s.append(">");
break;
default:
s.append(ch);
break;
}
}
token = s.toString();
Вы также можете проверить, не заменяете ли вы уже замененное вхождение. Для этого можно использовать регулярное выражение с отрицательным опережением.
Например:
String str = "sdasdasa&adas&dasdasa";
str = str.replaceAll("&(?!amp;)", "&");
Это приведет к строке « sdasdasa & amp; adas & amp; dasdasa
».
Шаблон регулярного выражения «& (?! amp;) "в основном говорит: Сопоставить любое вхождение '&', за которым не следует 'amp;'.
Экранирование строк может быть сложной задачей - особенно, если вы хотите принять во внимание Unicode. Я полагаю, что XML - один из наиболее простых форматов / языков, от которых нужно уйти, но все же. Я бы рекомендовал взглянуть на класс StringEscapeUtils в Apache Commons Lang и его удобный метод escapeXml .
Просто создайте строку, содержащую все данные, о которых идет речь, а затем используйте String.replaceAll () , как показано ниже.
String result = yourString.replaceAll("&", "&");
Если вы используете Spring, вы можете просто вызвать HtmlUtils.htmlEscape (String input)
, который будет обрабатывать перевод '&' в '&'.