как насчет awk?
$ awk -F"[<>]" '/\"a\"|\"c\"/{print $3}' test.t
a value
c value
$ cat test.t
<object>
<class = "a"> a value </class>
<class = "b"> xyz </class>
<class = "c"> c value </class>
<class = "d"> xyz </class>
</object>
Поскольку обычные файловые системы Unix работают иначе, чем файловые системы Windows, WSL хранит дополнительную информацию о специфичных для Linux свойствах файлов в расширенных атрибутах файлов Windows, используемых для их представления . Обычные программы Windows не знают об этих атрибутах и не сохранят их при редактировании файла. В этом случае важная информация о файле теряется.
Когда WSL пытается прочитать файл и не может найти ожидаемые атрибуты, выдается сообщение об ошибке, как и в случае повреждения собственной файловой системы. Если он вообще никогда не видит атрибуты в файле, этот файл считается несуществующим и не отображается в списках файлов.
Официальный совет WSL :
НЕ, ни при каких обстоятельствах создавать и / или изменять файлы Linux с помощью приложений Windows, инструментов, скриптов, консолей и т. Д.
Создание / изменение файлов Linux из Windows, скорее всего, приведет к повреждению данных и / или повреждению вашей среды Linux, и вам потребуется удалить и переустановить дистрибутив!
по этой причине (но крупнее, краснее и с большим количеством подчеркиваний). «Файлы Linux» означают все, что находится в вашем каталоге lxss
. Вы можете изменять обычные файлы Windows изнутри Linux через файловую систему / mnt / c / ...
DrvFS , но не наоборот.
Однако выпуск Windows 10 1903 года представляет новый механизм, который позволяет безопасно редактировать файлы из Windows , если вы все делаете правильно.Это не поможет решить проблему с уже поврежденными файлами, но поможет избежать ее в будущем.
Если вы уже редактировали файл и теперь не можете получить к нему доступ, все еще можно прочитать содержимое из самой Windows и восстановить файл таким образом.
Для этого вам необходимо:
AppData \ Local \ lxss
, где находится файл, с помощью проводника и переместить файл куда-нибудь. еще на вашем диске, например на рабочем столе. ls
. Проверьте файл, который вы переместили: запустите
cat /mnt/c/Users/.../Desktop/abc
, чтобы увидеть исходное содержимое файла.
Если до сих пор все сработало, вы можете скопировать этот файл обратно в то место, которое вы ожидали:
cp /mnt/c/Users/.../Desktop/abc ~ / алфавит / abc {{ 1}}
Команда cp
заставит WSL восстановить необходимые скрытые атрибуты в файле.
Эти инструкции будут работать для обычных файлов данных, но , если это важный файл операционной системы, вам может потребоваться полная переустановка .Для многих некритичных программ достаточно удалить поврежденный файл из Windows и переустановить программу с помощью диспетчера пакетов. Вы не сможете удалить файл изнутри Linux, если он поврежден.
Никогда не манипулируйте какими-либо файлами в каталоге lxss
из Windows. Вместо этого:
Если у вас есть файл, к которому вы хотите получить доступ как из Windows, так и из Linux, сохраните его вне каталога lxss
в любом другом месте вашей системы Windows. Вы можете открывать файлы Windows из Linux, используя автоматическое взаимодействие DrvFS : каталог / mnt / c
содержит все файлы с вашего диска C :, и их можно читать и записывать с Linux.
Начиная с выпуска Windows 1903 года (март 2019 года), WSL включает специальный файловый сервер, который делает ваши файлы доступными для всех приложений Windows. Если вы запустите
explorer.exe.
, то откроется проводник, показывающий текущий каталог Linux - вы можете копировать файлы в это окно или из него или редактировать их с помощью любого приложения. Путь к каталогу будет примерно таким: \\ wsl $ \ Ubuntu \ var \ www
: часть \\ wsl $ \
отправляет доступ к файлу по альтернативному, безопасному пути.
Если вы можете, это будет лучший путь вперед (или иногда пункт выше). Для более старых выпусков читайте дальше.
Если есть файл, который вам нужен в определенном месте, например файл конфигурации, и вы хотите отредактировать его из Windows, вы можете создать символическую ссылку изнутри Linux на реальное местоположение файла или каталога:
ln -s /mnt/c/.../abc ~ / .config / xyz / abc
Это будет работать до тех пор, пока файл не должен иметь каких-либо определенных разрешений или атрибутов в Linux (как исполняемый файл или ключ SSH).
В качестве альтернативы,и, возможно, лучше отредактируйте файлы Linux с помощью редактора Linux в терминале. nano
, vim
и emacs
все легко доступны и хорошо работают под WSL, хотя все они имеют свои особенности.
Если вам необходимо отредактировать файл с помощью программы Windows, у вас недостаточно последней версии Windows, и вы не можете сделать ее символической ссылкой, сделайте копию в другом месте для редактирования и скопируйте ее обратно из / mnt / c
затем, как и в случае с исправлением выше, или используйте контроль версий для синхронизации ваших изменений в нескольких местах.
Судя по некоторым экспериментам, обычный Блокнот действительно сохраняет необходимые атрибуты, но он не понимает окончания строк Unix, поэтому вы, вероятно, сами испортите содержимое, и я бы ни в коем случае не полагался на такое поведение. Поскольку это явно неподдерживаемая и недокументированная операция, маловероятно, что какой-либо редактор для Windows будет надежным.