Bash прочитать строку и заменить значение предыдущей строкой

Обновление, март 2014:

Во-первых, важно отметить, что uniqid является немного неправильным, поскольку он не гарантирует уникальный идентификатор.

В Документация по PHP :

ВНИМАНИЕ!

Эта функция не создает случайную или непредсказуемую строку. Эта функция не должна использоваться в целях безопасности. Использовать криптографически безопасную случайную функцию / генератор и криптографически защищенные хэш-функции для создания непредсказуемого безопасного идентификатора.

blockquote>

И

Эта функция не генерирует криптографически защищенные токены, в факт без каких-либо дополнительных параметров, возвращаемое значение мало отличается от microtime () . Если вам нужно генерировать криптографически безопасные маркеры, используйте openssl_random_pseudo_bytes () .

blockquote>

Установка большей энтропии в true генерирует более уникальное значение, однако время выполнения (хотя и в малой степени), согласно документам:

Если установлено значение TRUE, uniqid () добавит дополнительную энтропию (используя объединенный линейный конгруэнтный генератор) в конце возвращающее значение, что увеличивает вероятность того, что результат будет уникальным.

blockquote>

Обратите внимание на строку increases the likelihood that the result will be unique, а не на то, что гарантирует уникальность .

Вы можете «бесконечно» стремиться к уникальности, вплоть до точки и улучшать с помощью любого количества процедур шифрования, добавляя соли и т.п. - это зависит от цели.

Я бы рекомендовал посмотреть комментарии к основной теме PHP, в частности:

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php # 96549

http://www.php.net/manual/en/function.uniqid.php#95001

Что я «Рекомендую выработать , почему вам нужна уникальность, это для безопасности (т. е. добавить в процедуру шифрования / скремблирования)? Кроме того, Как уникально это нужно? Наконец, посмотрите на скорость рассмотрения. Пригодность изменится с учетом основных соображений.

0
задан navku 18 January 2019 в 12:10
поделиться

2 ответа

Использование однострочного Perl

 perl -0777 -pe ' s/(<Product ID=\"(\S+)\".+?<Name>)(.+?)</$1$2</msg '

С заданными входами

$ cat navku.xml
 <Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
  <Name>1234</Name>
  <Values>
    <Value AttributeID="A">1</Value>
    <Value AttributeID="B">00</Value>
     </Values>
</Product>
 <Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
   <Name>1234</Name>
  <Value AttributeID="A">4</Value>
    <Value AttributeID="B">10</Value>
     </Values>
 </Product>
$ perl -0777 -pe ' s/(<Product ID=\"(\S+)\".+?<Name>)(.+?)</$1$2</msg ' navku.xml
 <Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
  <Name>ABC1234</Name>
  <Values>
    <Value AttributeID="A">1</Value>
    <Value AttributeID="B">00</Value>
     </Values>
</Product>
 <Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
   <Name>XYZ1234</Name>
  <Value AttributeID="A">4</Value>
    <Value AttributeID="B">10</Value>
     </Values>
 </Product>
$
0
ответ дан stack0114106 18 January 2019 в 12:10
поделиться

РЕДАКТИРОВАТЬ: В случае, если в соответствии с комментарием OP, если в строке содержится более " значений, я выбираю самое первое значение в диапазоне от " до ".

awk -F'[>"<]' '
/Product ID/{
    match([110],/"[^"]*/)
    val=substr([110],RSTART+1,RLENGTH-1)
}
/<Name>/{
    sub(/>.*</,">"val"<")
}
1'  Input_file

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

awk -F'[>"<]' '
/Product ID/{
    match([111],/"[^"]*/)
    val=substr([111],RSTART+1,RLENGTH-1)
}
/<Name>/{
    sub(/>.*</,">"val"<")
}
1'  Input_file
 <Products>
<Product ID="ABC1234" UserID="XYX" SUperUserID="ROOT" >
  <Name>ABC1234</Name>  
  <Values>
    <Value AttributeID="A">1</Value>
    <Value AttributeID="B">00</Value>
     </Values>
</Product>
 <Product ID="XYZ1234" UserID="XYX" SUperUserID="ROOT" >
   <Name>XYZ1234</Name>
  <Value AttributeID="A">4</Value>
    <Value AttributeID="B">10</Value>
     </Values>
 </Product>


Не могли бы вы попробовать следующее.

awk -F'[>"<]' '
/Product ID/{
    match([112],/".*"/)
    val=substr([112],RSTART+1,RLENGTH-2)
}
/<Name>/{
    sub(/>.*</,">"val"<")
}
1' Input_file
0
ответ дан RavinderSingh13 18 January 2019 в 12:10
поделиться
Другие вопросы по тегам:

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